我對Prolog相當陌生。無論如何,我試圖編寫一套遞歸規則,返回給定字符代碼列表中每個單詞的平均字符數。我的代碼如下。Prolog重新發起呼叫,並沒有明顯的原因失敗
medellangd(Text,AvgLen) :-
medellangd(Text,T,1,0,0),
AvgLen = T.
medellangd([],AvgLen,Space,Words,Chars) :-
T is (Chars/Words),
AvgLen = T.
medellangd([A|B],AvgLen,Space,Words,Chars) :-
succ(Chars,C),
updatewords(A,Space,Words,W),
updatespace(A,S),
medellangd(B,T,S,W,C),
AvgLen = T.
updatewords(A,1,Words,W) :-
member(A, [65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122])
-> succ(Words,S),
W = S
; W = Words.
updatewords(A,0,Words,W) :-
W = Words.
updatespace(A,S) :-
member(A,[65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122])
-> S = 0
; S = 1.
,其原因我也說不上來,雖然AvgLen得到正確的值,序言當我打電話medellangd([68,69],AvgLen)返回false。當我跟蹤這個調用時,儘管每次調用最初在AvgLen獲取其值之前退出,但如果在AvgLen值賦值之後輸入分號,並且失敗,則Prolog決定重做「(9)更新字(68,1,0,_G2574)」 。爲什麼會發生?
我幾乎可以肯定,你的'updatewords/4'就是選擇點來自於。順便說一下,我不明白你爲什麼要在謂詞定義的末尾做所有這些顯式的統一...你有沒有理由? – 2016-09-17 20:47:10