2011-02-27 24 views
0
 findThree([H|T],_,3).  
     findThree([H|T], M, Z):- 
      (member(H,M) 
       -> Z2 is Z + 1, 
       select(H,M,C), 
       findThree(T,C,Z2) 
       ;select(H,M,C), 
       findThree(T,C,Z) 
      ). 

私がやっていることは、要素が指定されたリストにあるかどうかを確認することです。そうであれば、変数を増やして3つ見つけたら停止します。しかし、私の構文には問題がありますか? SWI-PrologでIf-else構文を使用しようとしています。それが問題だろうか?Prologでこの述語に問題がありますか?

+0

私はプロローグについてあまり知らないが、私は「変数をインクリメントすると、」あなたが行うことができない何かであることを知っています。もっと宣言的なアプローチを試してみてください(それはあまり役に立ちません)。 – luqui

答えて

1

Z is Z + 1は常に整数に失敗します。 Z + 1の値を計算し、Zと統合しようとします。 Zは通常、Z + 1と同じ値ではないため、isは失敗します。新しい変数Z2を作成し、Z2 is Z + 1を使用し、Zの代わりにZ2を使用する必要があります。

あなたのコードを撮影し、修正を行う:

findThree(_,_,3). % This should allow anything as the first element 

findThree([H|T], M, Z) :- 
    select(H, M, C), Z2 is Z + 1, findThree(T, C, Z2). % select includes member implicitly 
findThree([_|T], M, Z) :- 
    findThree(T, M, Z). % Allow this second case since it simplifies the code 
+0

これは、1つのアイテムを検索する場合には機能しますが、3つのアイテムについては失敗します。 – Waffles

+0

通常、バックトラックするだけで、if-then-else句を使用してPrologを作成しません。あなたは 'M'という値の' N'個のコピーを探したいでしょうか?私はあなたの質問の説明からかなり分かりませんでした。 –

+0

まあ、リストAの中のいくつの要素がリストBにあるのか見たいと思っています。この場合、BにあるAに3つの要素があるかどうかを調べようとしています。 – Waffles

関連する問題