我剛開始使用序言,我有一個關于遞回的問題。
我基本上想計算某個值在串列中的次數,所以我有例如:
count( a, [ a, s, d, f, g, a, s, d, a, s ], W ). W = 3.
我想計算“a”在串列中的次數并將數字存盤在“W”中。
正確答案是
count( _, [], 0 ).
count( A, [B|S], X ) :- A==B, count( A, S, Y ), X is Y 1.
count( A, [B|S], X ) :- \ A == B, count( A, S, X ).
但是,我不明白為什么在第 2 行中,最后是“X 是 Y 1”。這條線不應該是
count( A, [A|S], X ) :- Y is X 1, count( A, S, Y ).
在這種情況下,我們首先將 Y 設定為 1,然后通過遞回再次將其發送到“計數”。
如果有人可以幫助我,我將不勝感激!
uj5u.com熱心網友回復:
當你打電話時考慮一下:
?- count(a,[a,s,d,f,g,a,s,d,a,s],W).
...然后第一個匹配的謂詞是count(A,[B|S],X)。因此,這意味著,它認為它喜歡count(a,[a|S],X)哪里S&X是變數。X只是W來自原始呼叫,所以它仍然是一個變數。
建議Y is X 1然后評估是沒有意義的,因為它X是一個變數。
然而,原始謂詞確實有意義。
count(A,[B|S],X) :- A==B, count(A,S,Y), X is Y 1.
當它遞回時,它將一個新變數發送Y到第二個count/3謂詞中(或者只是在第三個謂詞中傳遞相同的變數)。它會一直這樣做,直到它最終將變數統一為0. 那時它展開遞回,現在它終于可以做X is Y 1(因為Y是一個值),因此X現在是一個值。
Prolog 是一種有趣的語言,因為它幾乎具有時間旅行的感覺,您必須向前和向后思考才能理解程式的作業原理。
uj5u.com熱心網友回復:
count( A, [B|S], X ) :- A==B, count( A, S, Y ), X is Y 1.
這意味著:如果S含有Y的出現A,和A == B,然后[B | S]包含一個更發生A。
例如,假設我們在計算prologin的出現次數時到達這里[prolog, prolog, prolog]。[B | S] = [prolog, prolog, prolog],所以S = [prolog, prolog]。prologin出現的次數S是 2,所以我們應該有Y = 2。prologin的出現次數[B | S]是 3,所以我們應該有X = 3。一旦我們知道Y = 2,然后X is Y 1計算 的這個正確值X。
count( A, [A|S], X ) :- Y is X 1, count( A, S, Y ).
這意味著:如果[A | S]包含 的X出現A,則S包含更多的A。這不可能。
再次使用上面的例子:顯然[A | S] = [prolog, prolog, prolog]包含 3 次出現prolog,所以X = 3應該保持。但是 thenY必須是 4,并且主體中的目標將嘗試證明S = [prolog, prolog]包含4次出現prolog。這顯然不是這種情況。
請注意,此解釋只是關于謂詞的含義。它不需要我們考慮遞回、目標的順序或程式實際執行的確切方式。在進行 Prolog 編程時,盡量先弄清楚你的程式的邏輯含義。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/375103.html
上一篇:創建一個接受任意數量函式的函式
