2017-10-21 3 views
1

私はプロローグから始まり、練習としてリストを逆転しようとしています。プロローグでのリストの逆転

例えば、inv([1,2,3], S)S = [3,2,1]. は以下のパートナーと私はすでにやっていることである与える必要があります。

conc([], L, L). 
conc([X|L1], L2, [X|L3]) :- conc(L1, L2, L3). 

tail([X|Y], S) :- conc([], Y, S). 

inv([X|Y], S) :- tail([X|Y], TAIL), inv(TAIL, R_TAIL), conc(R_TAIL, X, S). 
inv([], []). 

最初の3行は正常に動作します。しかし、実際には最後の2つで何が起こっているのか理解していないので、それを修正する方法はありません。 私はちょうどを探しています(これは働いています、私はちょうどtail機能を使用するとき)、それを逆にして、それをリストの先頭に付け加えます。 あなたは私を助けてもらえますか?

+0

あなたの問題はあなたが通常APPENDと呼ばれるあなたの濃塩酸/ 3述語(ですべてを解決しようということです/ 3)。あなたのtail/2述語について考える。それは何ですか?リストの最初の要素を削除し、空のリストをリストの末尾に連結して、リストの末尾を取得します。それは余分です。変数Yにはすでにリストの末尾が含まれています。したがって、単純な事実である 'tail([_ X | Y]、Y).'よりもテール述語が本当に必要な場合は、ジョブを実行します。 –

+0

2番目の最後の行には 'conc(R_TAIL、X、S)'と書かれているので、コードは機能しません。ここでR_TAILはリストであり、Xはリスト要素です。したがって、要素をリストと連結しようとします( 'conc(R_TAIL、[X]、S)'で動作します)。何が起こるかを理解するために、単純なクエリのトレース(例えば 'inv([1,2]、X)')を常に見てみてください。 –

+0

@JoanCうん、それは働いた:) 答えをありがとう。私は本当にプロローグとこの構文の問題から始まっています。私はそれが私に起こるはずだと思う:p –

答えて

1

あなたのコードは私にとっては機能しません。

代わりにこの方法を試してみてください:

?- reverse([1,2,3],Xs), write(Xs). 

reverse(Xs,Ys) :- reverse(Xs,[],Ys). 

reverse([],A,A). 
reverse([H|T],R,A) :- reverse(T,[H|R],A). 
+1

[tag:prolog-toplevel]に 'write/1'を使う理由は? – repeat

+1

@repeat - 'Xs'の値をコンソールに表示するだけです。計算には必要ありません。 – Enigmativity

+1

私はそれほど得意ではありません。とにかく変数のバインディングをトップレベルに示します。なぜ 'write/1'を使うのですか? – repeat

2

代替foldlの/ 4ベースのソリューション:

prepend_element(E, L, [E|L]). 

inv(List, Reversed) :- 
    foldl(prepend_element, List, [], Reversed). 
関連する問題