2011-10-25 101 views
0

我想要计算列表中出现多少个g项,下面是我现在正在尝试的代码,但返回时我得到了错误。Prolog计算列表中的元素

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). 

回答

1

致电?- countFruit(H,0).您正在告诉序言,将countfruit\2谓词中的No变量统一为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. 
+0

嗨,我能和你聊聊吗? – user236501

+0

@ user236501 - 你想聊什么? – Enigmativity

+0

澄清打印元素问题 – user236501

0

你的代码包含一个错误:因为countFruit/2使用相同头的第二和第三条,你应该不会(G(H))第二条在测试后添加切。否则,你会在回溯时得到错误的答案。另外,不是使用不是(g(H)),而是通过检查g(H)来简化代码,并相应地重新规定第二个和第三个子句。但这只是美化。

除此之外,我看不出您的代码有一个明显的问题。你能提供导致'错误'的实际查询吗?