2011-01-10 21 views
6

こんにちはリストに要素を挿入しようとしていますが、結果は元のリストに保存されていて新しいものではないことが非常に重要です。
最終結果が保持される新しいリストを作成すると、インターネット上で書いたまたは見つけたコードはすべて成功します。
私の質問は誰でも関数を定義する方法を教えてくれます:insert(X、L)ここでXは要素、Lはリストです。リストに要素を挿入して同じリストを返す

+0

リストを適切に更新する必要がある場合は、あまりにも絶対に考える必要があります。解決しようとしている問題について詳しく説明できますか? – Juliet

答えて

3

いいえ、プロローグはそのようには機能しません。値を「変更する」ことはありません。変数は特定の値で統一できますが、すでに[1,3]だった場合は、後で[1,2,3]になることはありません。

2

ascheplerによれば、適切なリスト、つまりすべての要素が既にバインドされているリストを追加したり変更したりすることはできません。唯一の「変更」は、ある表現を別の表現と統一することです。

しかし、追加の要素を最後に追加することができる部分リストの概念があります。これは典型的には差異リストとして知られていますが、その名前はすぐには理解できません。

空のリストではなく、フリー変数Xで始めるとします。しかし、XからXを減算して「無」と考えるかもしれません。つまり、空の差分リストはX - Xで表されます。ここでマイナス「 - 」は純粋に正式な演算子です。差異の評価は意図されていない。これは、あなたが(おそらく)したいことを達成するために差異リストをどのように使うことができるかからわかるように、便利な構文です。

次のように私たちは、差分リストに要素を追加することができます:ここで

insertDL(M,X-Y,X-Z) :- Y = [M|Z]. 

Mは、我々が追加する新しい要素である、XYは「古い」差分リストで、XZは「新」ですZが部分リストXの「開いた」尾部になるように、部分リスト[M | Z]を用いて以前に空いていた変数Yを統合することによって(Mが追加された)

最後に差異リストに項目を挿入すると、その時点の「フリーテール」を空のリスト[]に設定することでXを適切なリストにすることができます。この意味では、Xは最初に始めたときと同じ変数であり、自由変数から適切なリストへの段階的なステップで統一されています。

これはPrologプログラミングでは非常に強力なテクニックであり、それを快適に使用するにはある程度の練習が必要です。

[プロローグリストから差にリスト]
http://www.irisa.fr/prive/ridoux/ICLP91/node8.html

[プロローグで実装差異リスト]
http://www.cl.cam.ac.uk/~jpw48/difflists.pdf

:Web上でさらなる議論へのリンク[講義ノート:差分リスト]
http://www.cs.cmu.edu/~fp/courses/lp/lectures/11-diff.pdf

1

一部のプロローグでは、用語を変更するためにsetarg/3述語が提供されています。 場所。

あなたはPrologでsetarg/3を使用する必要があるとき、リスト上でそれを使用するためには、あなただけの、いずれの場合も関手'.'/2

で、彼らは複合語のチェーンのちょうど素敵な表現であることを考慮する必要があり、それはたぶんあなたが何か間違っていることを意味します。

関連する問題