在列表Prolog中找到2的幂

我正在尝试在Prolog(SWI Prolog)中创建一个列表,并检查哪些数字是2的幂,然后第二次查找该列表中特定数字的次数(在本示例中,我试图查找该数字多少次)列表中为3)。例如,如果您问


?- check([0,2,3,-5,-2,1,8,7,4], MULT2, THREE).

你应该看到


MULT2=[2,8,4] 

THREE=1 

我的第一个尝试找到解决方案的方法是搜索带有head的列表,并执行head mod 2 = 0以查找所有2的幂的数字,但是出了点问题,我只得到“ false”作为答案。


烙印99
浏览 557回答 2
2回答

暮色呼如

这是您以逻辑上纯净的方式找到“二的幂”的方法!使用sicstus-prolog 4.3.5 library(reif)和library(clpz)::-use_module([ library(reif),library(clpz) ])。power_of_two_t(I,T):-   L#=分钟(I,1),   M#= I / \(I-1),   呼叫((L = 1,M = 0),T)。%使用库(reif)的(=)/ 3和(',')/ 3结合使用元谓词的示例查询1:tfilter/3power_of_two_t/2?- tfilter(power_of_two_t, [0,2,3,-5,-2,1,8,7,4], Ps).Ps = [2,1,8,4].                  % succeeds deterministically这是由注释建议的更一般的查询:?- tfilter(power_of_two_t, [X], Ps).   Ps = [X], 0#=X/\_A, _A+1#=X, X in 1..sup, _A in 0..sup;  Ps = [], dif(_A,0), _A#=X/\_B, _B+1#=X, X in 1..sup, _B in 0..sup;  Ps = [], dif(_A,1), _A#=min(X,1), _B#=X/\_C, _C+1#=X, X#>=_A, _A in inf..1.脚注1:整理了上面显示的应答序列以指示呼叫的确定性。脚注2:要重现结果,请使用call_det/2如下定义:call_det(G_0,Det):-   call_cleanup(G_0,标志=设置),   (nonvar(Flag)   -> Det = true   ; Det =假   )。

炎炎设计

在一个谓词中同时执行两项如此不同的任务是一件奇怪的事。您可能应该有两个单独的谓词,一个谓词用于计算2的幂,另一个谓词用于计算3s。然后,您可以将它们组合成一个谓词,例如:check(Nums, MULT2, THREE) :-    count2powers(Nums, MULT2),    count3s(Nums, THREE).之后,您可以进一步分解并使用单独的谓词来检查数字是否为2的幂:is2power(1).is2power(N) :-    N > 0,    N2 is N // 2,    N2 * 2 =:= N,    is2power(N2).这是基本的软件工程,通过这种方式,您可以逐步构建程序,并且不仅可以提出“整个程序都返回false”,还可以提出更具体和有意义的问题。
打开App,查看更多内容
随时随地看视频慕课网APP