亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在列表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 關注
  • 586 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號