2011-10-25 6 views
0

リストに表示される項目の数を数えたいと思っています。以下は現在試していたコードですが、返されたときにfalseになっています。リスト内の要素数をカウントするプロローグ

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に統一されるようにプロローグに伝えられます。結果は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. 
+0

こんにちは、私はあなたとチャットすることができますか? – user236501

+0

@ user236501 - 何についておしゃべりしますか? – Enigmativity

+0

印刷要素の問題を明らかにする – user236501

0

あなたのコードは、1つのバグが含まれています:countFruit/2を使用同じヘッドの第2及び第三節以来、あなたは、第二節ではない(G(H))のテストの後にカットを追加する必要があります。そうしないと、バックトラッキングで間違った答えが出ます。

また、not(g(H))を使用する代わりに、代わりにg(H)をチェックして、2番目と3番目の節を再整形することでコードを簡略化できます。しかし、それはちょうど美しいです。

それ以外は、コードに明白な問題はありません。 「偽」となった実際のクエリを提供できますか?

関連する問題