2011-10-25 169 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)來簡化代碼,並相應地重新規定第二個和第三個子句。但這只是美化。

除此之外,我看不出您的代碼有一個明顯的問題。你能提供導致'錯誤'的實際查詢嗎?