簡體   English   中英

Prolog:鏈接多個規則

[英]Prolog: Chaining multiple rules

所以我絕對是 Prolog 的初學者。 我現在正在學習遞歸,這就是我迄今為止在任務中得到的。

dance(start). 
dance(forward(T)) :- dance(T). 
dance(backward(T)) :- dance(T). 

count(start,0,0).                   
count(forward(X),succ(Y),Z) :- greater(X,Y,Z).  
count(backward(X),Y,succ(Z)) :- greater(X,Y,Z).   

greater(succ(0),0).   
greater(succ(Y),succ(Z)):-greater(Y,Z).`

應該做的事情的總結:可以有從“開始”開始的舞蹈,然后每次遞歸向前或向后添加。 在計數方面,我設法能夠計算給定序列中向前和向后的數量,並將它們保存在“succ”符號中,更重要的是,我想比較兩個這樣的“succ”數字。 如果第一個參數更大(包含比第二個參數更多的“成功”),則為 true。

現在我的任務是編寫一個新規則“more(X)”,如果序列 X(從舞蹈構建)的向前多於向后,則該規則為真。 我想我有我需要的所有子任務,但現在我無法將它們鏈接在一起,因為直到現在我只有 2 個具有相同數量參數的規則,但在這種情況下,我得到了一個具有一個、兩個和三個參數的規則. 解決方案應該是這樣的

more(X):-greater(Y,Z)

但是如何將我的“成功”數字從“計數”變為“更大”,並將給定的序列 X 變為“計數”? 我確實必須更改一些規則,否則永遠不會調用計數,對嗎?

所以它應該更像是more(X):-greater(count(X,Y,Z))

但是像這樣,我必須更改更大的規則才能“獲取”這種類型的參數。

示例查詢 ?- more(backward(forward(start)))。

錯誤的。

?- 更多(前進(開始))。

真的。

您的dance/1count/3謂詞似乎是正確的。

如果你想要“更大”,其中greater(X, Y)意味着X 大於Y,你會寫:

greater(succ(_), 0).
greater(succ(X), succ(Y)) :- greater(X, Y).

您的解決方案會檢查 X 是否正好比 Y 大 1。

請注意,沒有任何東西大於 0。

如果你在count/3greater/2方面實現more/1 ,你會寫:

more(X) :-
    count(X, Forward, Backward),
    greater(Forward, Backward).

所以它應該更像是more(X):-greater(count(X,Y,Z))

不,你寫的好像它是 Python 並且greater(count(X,Y,Z))將在count 返回時調用greater(...) Prolog 謂詞不是函數調用,並且count(...)不會以這種方式返回任何內容。

計數的結果是 Y 和 Z。(您使用的這些名稱可能更清晰)。 進行計數,然后將 Y 和 Z 用於其他用途。

count(X,Y,Z),
greater(Y,Z)

逗號是 AND; “如果 X 的計數為 Y 且 Z AND Y 大於 Z,則此代碼有效”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM