何か問題があります。私は、リスト内の要素の出現回数を返す関数を書いています。Prolog:複数の回答を返すリスト内の要素の出現をカウントする
N = 5 ?
が、その後のような複数回答あります:これは正常に動作します
occurencesHelp(X,[],N,N).
occurencesHelp(X,[X|T],N,Y) :-
N1 is N+1,
occurencesHelp(X,T,N1,Y).
occurencesHelp(X,[H|T],N,Y) :-
occurencesHelp(X,T,N,Y).
occurences(X,List,N) :-
occurencesHelp(X,List,0,N).
、私が得る最初の答えは次のとおりですので、上の
N = 4 ? ;
N = 4 ? ;
N = 3 ? ;
N = 4 ? ;
N = 3 ? ;
とは、ここでは、コードです。私はそれがなぜそうであるかを見ることができるかどうかを調べるためにトレースを試みましたが、それを理解することはできません。私はカットを使用すると私を助けると思うが、カットを使わないように特別に言われているので、これはオプションではない。どんな助けもありがとう。
ありがとうございました。
は、Xを追加し、返信いただき、誠にありがとうございます\ = Hは本当に問題を解決します。明確にするために、なぜこれを明示的に指定する必要があるのですか?私が理解しているところでは、X = Hならカウンタをインクリメントする節を使い、X \ = Hならばそれをそのまま維持する節に行くでしょう。カウンターをX = Hで変更しないでおく句のインスタンスがあるのはなぜですか?これが些細なことであれば、ちょうど私の頭を包み込むようにしようとすると謝罪します。ありがとう。 – Faz
@Fazあなたの2番目のケースが明示的に 'X \ = H'を強制しない場合、' X = H 'のケースは両方のケースにマッチします。覚えておいてください:Prologはあなたのルールに合致するすべての可能な解決策を探します。 – lurker