我对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) 时,Prolog 返回 false。当我跟踪此调用时,尽管在 AvgLen 获取其值之前最初退出了每个调用,但如果我在 AvgLen 赋值后输入分号,Prolog 决定重做“(9) updatewords(68, 1, 0, _G2574)”,并且失败. 为什么会这样?