私はProgramming in Prolog: Using the ISO Standardを読んでいるが、私はこの本によって導入append
の再帰的定義の理解の問題を抱えている:例えば理解プロローグ「追加」再帰的定義
append([], List, List).
append([X|List1], List2, [X|Result]) :- append(List1, List2, Result).
:
?- append([a, b, c], [3, 2, 1], Result).
Result = [a, b, c, 3, 2, 1]
を私が理解する限り、結果リストには最初のリストの先頭が先頭に含まれるはずであるため、最初は結果リストは[ a ]
です。次に、第1引数と第3引数の末尾に再帰的にappend()
を実行し、2番目の引数をそのまま残して、3番目の引数([ a ]
)に新しい最初の引数の先頭をその先頭に含める必要があります。リストは[ b, a ]
です(これは後方ですので、私は正しく従っていません)。ある時点で、最初のリストは[]
あり、そして得られた配列は[ c, b, a ]
あるので、我々はベースケースヒット:
append([], List, List).
のでappend([], [3, 2, 1], [ c, b, a ]).
、全く意味がありません。また、定義全体で操作が行われない場合、第2のリストの内容がどのように考慮されるかについては従わない。
定義によると、結果のリストには最初のリストの先頭がその先頭に含まれるはずです。*最初は結果リストは '[a | Result] '' Result'はまだインスタンス化されていません。次に、 'Result'は' [b |結果2] 'となるので、リスト全体がもう少し分かるようになります。' [a、b |結果2]。 [その他](https://stackoverflow.com/questions/11539203/how-do-i-append-lists-in-prolog/11551001#11551001) –
'append/3'の定義が再帰的であるという事実は、本当にポイントの横にある。あなたはあなたの質問をたどることができたでしょうし、各回帰レベルで何が起こったのか正確に見ていたでしょう。ここで重要なことは、述部自体が評価された場合に成功するための3つの引数のそれぞれについて保持しなければならないものを定義することです。 @matの答えはこれを詳しく説明していますが、私はちょうど反復することが傷つけられないと感じました。 –