2017-09-23 16 views
1

数字とリストが与えられたときにその倍数のないリストを返すプロローグプログラムを作成するはずです。今私はこれを作った:Prologで倍数を削除する

removeMultiples([],[]). 
removeMultiples(N, [Head|Tail], Result):- 
    Head mod N =:= 0, 
    removeMultiples(N, Tail, Result). 
removeMultiples(N, [Head|Tail], [Head|Result]):- 
    Head mod N =\= 0, 
    removeMultiples(N, Tail, Result). 

それは動作しないし、私は本当になぜ取得していない。
私は誰かがなぜこれがうまくいかないかを説明できることを願っています。
ありがとう

+0

"うまくいきません "というメッセージが表示されない場合は、質問を更新して正確に説明してください。あなたがエラーを取得している、コードが失敗している、それは予期しない結果などを与えるのですか? – FluffyKitten

答えて

3

短い答え:最初の句には2つの引数しかありません。

同じ述語removeMultiples/3を呼び出すたびに、removeMultiples/3で再帰呼び出しを行います。このようにして、両方のリストを列挙します。しかし、最終的にはリストの最後に到達します。

ただし、最初の節はremoveMultiples/2述語についてです。ですから、三番目の引数追加する必要があります。

removeMultiples(_,[],[]). % three arguments 
removeMultiples(N, [Head|Tail], Result):- 
    Head mod N =:= 0, 
    removeMultiples(N, Tail, Result). 
removeMultiples(N, [Head|Tail], [Head|Result]):- 
    Head mod N =\= 0, 
    removeMultiples(N, Tail, Result).

を今では生産:

?- removeMultiples(3, [1,2,3,4,6,7,8,9,15,3,1], Result). 
Result = [1, 2, 4, 7, 8, 1] ; 
false. 
+1

ああうわー...私は何時間も見つめていなかった。本当にありがとう! – Melanie

2

あなたはSWI-Prologのを使用する場合は、あなたがfunctionnalデザインを持つことができます。

:-use_module(library('lambda.pl')). 

removeMultiples(N, In, Out) :- 
    exclude(N+\X^(X mod N =:= 0), In, Out). 
関連する問題