2017-10-13 4 views
3

リストAとリストBの両方からn番目のエレメントを削除し、それぞれのn番目のエレメントと一致しないようにしたいとします。したがって、たとえば:Aのリストは[1,2,3,4,5]Bのリストは[1,2,2,4,7]です。結果はリストCには[3,5]、リストDには[2,7]が含まれているはずです。私はこの小さなコードを考え出しましたが、まだ正しく動作していません。代わりに[3,5][2,7]再帰を使用してリストに複数のヘッドを追加する方法

without_doubles([], [], [_], [_]). 
without_doubles([H|T1], [H|T2], C, D):- 
    without_doubles(T1, T2, C, D). 
without_doubles([H1|T1], [H2|T2], [H1|C], [H2|D]):- 
    without_doubles(T1, T2, C, D). 

、私は[3,5,_G2442][2,7,_G2445]を取得しています。私はそれがおそらく修正するのは簡単だが、私はそれを把握するように見えることはできません知っている。事前に助けてくれてありがとう!

+1

'_'sは' without_doubles([]、[]、[_]、[_]) 'でやっていますか。? –

+0

私は個人的に、基本ケースが再帰の目標状態を記述しなければならないと考えました。したがって、AとBは空であり、CとDはいくつかのランダム変数を含んでいます( '_'のように)。 – Boomer

+1

Prologには本当に「入力」と「出力」はありません。また、逆の方法でクエリを実行することもできます。残念ながら、私は、Haskell/Prologの通訳が多くの魔法のことをする人がたくさんいます。実際、インタプリタの仕組みは非常に単純です(ただし、最適化は非常に複雑です)。アンダースコアは単に匿名変数を意味します。あなたは 'without_double([]、[]、[A]、[B])'と書くことができました。同じように。 –

答えて

4

あなたの最初のルールは次のようになります。あなたが前に持っていた

without_doubles([], [], [], []). 

2つの匿名の変数_はあなたの問題の原因でした。

?- without_doubles([1,2,3,4,5],[1,2,2,4,7],L,R). 
L = [3, 5], 
R = [2, 7] ; 
L = [3, 4, 5], 
R = [2, 4, 7] ; 
L = [2, 3, 5], 
R = [2, 2, 7] ; 
L = [2, 3, 4, 5], 
R = [2, 2, 4, 7] ; 
L = [1, 3, 5], 
R = [1, 2, 7] ; 
L = [1, 3, 4, 5], 
R = [1, 2, 4, 7] ; 
L = [1, 2, 3, 5], 
R = [1, 2, 2, 7] ; 
L = [1, 2, 3, 4, 5], 
R = [1, 2, 2, 4, 7]. 

は明らかに我々は唯一の最初の結果ではなく、他のものをしたい:

は、しかし、あなたのコードの第2の問題があります。 はあなたの最後のルールでH1H2が異なるはずですのでと他のものを取得する理由です。これは、Prologが2番目のルールを適用できるときに、最後のルールを適用してそのすべての選択ポイントを作成できるようになることを意味します。

あなたは明示的にH1H2dif/2を使用して、あなたの最後のルールで異なっていなければならないことを示すことによってこの問題を解決することができます

without_doubles([H1|T1], [H2|T2], [H1|C], [H2|D]):- 
    dif(H1, H2), 
    without_doubles(T1, T2, C, D). 

は、今、私たちは持っている:

?- without_doubles([1,2,3,4,5],[1,2,2,4,7],L,R). 
L = [3, 5], 
R = [2, 7] ; 
false. 
+0

助けていただきありがとうございます。 – Boomer

3

をあなたには二つの問題があります。コード:

  1. si ngletonは第3引数と第4引数としてリストしますが、これらは空のリストでなければなりません。
  2. 2番目の節を逆戻りするのを妨げるものは何もないので、3番目の節が必要です。

次のように、この問題を解決することができます

%% no [_], but [] 
without_doubles([], [], [], []). 
without_doubles([H|T1], [H|T2], C, D):- 
    without_doubles(T1, T2, C, D). 
%% guard the fact that H1 and H2 are different 
without_doubles([H1|T1], [H2|T2], [H1|C], [H2|D]):- 
    dif(H1,H2), 
    without_doubles(T1, T2, C, D).
+0

私を助けてくれてありがとう! – Boomer

関連する問題