列表中的Prolog计数元素

时间:2011-10-25 05:29:36

标签: list prolog

我想要计算列表中出现的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).

2 个答案:

答案 0 :(得分:1)

致电?- countFruit(H,0).,您正在告诉prolog将No谓词中的countfruit\2变量统一为0。因此结果只能是0fail

如果我按原样运行你的代码,我会得到以下结果:

>>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))。但这只是美化。

除此之外,我看不到代码的明显问题。你能提供导致'假'的实际查询吗?。