我想要计算列表中出现的g项目数量,下面是我现在尝试的代码,但返回时我得到了错误。
g(E) :- memberchk(E, [apple, orange, pear, grape, lycee, pineapple,dragonfruit]).
countFruit([], No):- write(' >> No of Fruits : '), write(No), nl.
countFruit([H|T], No) :- not(g(H)), countFruit(T,No).
countFruit([H|T], No) :- No1 is No+1, countFruit(T,No1).
?countFruit(H,0). (H is a list).
答案 0 :(得分:1)
致电?- countFruit(H,0).
,您正在告诉prolog将No
谓词中的countfruit\2
变量统一为0
。因此结果只能是0
或fail
。
如果我按原样运行你的代码,我会得到以下结果:
>>NoofFruits:0
Yes.
以下是我对这个问题的看法:
countFruit(Xs, No) :-
countFruit(Xs, No, 0).
countFruit([], No, No).
countFruit([H|T], No, X0) :-
member(H, [apple, orange, pear, grape, lycee, pineapple, dragonfruit]),
!,
X1 is X0 + 1,
countFruit(T, No, X1).
countFruit([_|T], No, X) :-
countFruit(T, No, X).
?- countFruit([orange, dog, dragonfruit, lycee], X),
write(" >> No of Fruits : "),
write(X),
nl,
fail.
答案 1 :(得分:0)
您的代码包含一个错误:由于countFruit / 2的第二个和第三个子句使用相同的头,因此您应该在第二个子句中的not(g(H))测试之后添加一个剪切。否则,你会在回溯上得到一个错误的答案。
此外,您可以通过检查g(H)并相应地重新构造第二个和第三个子句来代替使用not(g(H)),而不是使用not(g(H))。但这只是美化。
除此之外,我看不到代码的明显问题。你能提供导致'假'的实际查询吗?。