私はプロローグから始まり、練習としてリストを逆転しようとしています。プロローグでのリストの逆転
例えば、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
機能を使用するとき)、それを逆にして、それをリストの先頭に付け加えます。 あなたは私を助けてもらえますか?
あなたの問題はあなたが通常APPENDと呼ばれるあなたの濃塩酸/ 3述語(ですべてを解決しようということです/ 3)。あなたのtail/2述語について考える。それは何ですか?リストの最初の要素を削除し、空のリストをリストの末尾に連結して、リストの末尾を取得します。それは余分です。変数Yにはすでにリストの末尾が含まれています。したがって、単純な事実である 'tail([_ X | Y]、Y).'よりもテール述語が本当に必要な場合は、ジョブを実行します。 –
2番目の最後の行には 'conc(R_TAIL、X、S)'と書かれているので、コードは機能しません。ここでR_TAILはリストであり、Xはリスト要素です。したがって、要素をリストと連結しようとします( 'conc(R_TAIL、[X]、S)'で動作します)。何が起こるかを理解するために、単純なクエリのトレース(例えば 'inv([1,2]、X)')を常に見てみてください。 –
@JoanCうん、それは働いた:) 答えをありがとう。私は本当にプロローグとこの構文の問題から始まっています。私はそれが私に起こるはずだと思う:p –