为了账号安全,请及时绑定邮箱和手机立即绑定

在列表Prolog中找到2的幂

在列表Prolog中找到2的幂

烙印99 2019-11-04 13:19:57
我正在尝试在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”作为答案。
查看完整描述

2 回答

?
暮色呼如

TA贡献1853条经验 获得超9个赞

这是您以逻辑上纯净的方式找到“二的幂”的方法!


使用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 =假

   )。


查看完整回答
反对 回复 2019-11-04
?
炎炎设计

TA贡献1808条经验 获得超4个赞

在一个谓词中同时执行两项如此不同的任务是一件奇怪的事。您可能应该有两个单独的谓词,一个谓词用于计算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”,还可以提出更具体和有意义的问题。


查看完整回答
反对 回复 2019-11-04
  • 2 回答
  • 0 关注
  • 544 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信