あなたの質問を文字通り解釈できます。リストのようなデータ構造。テールへのアクセスは補助述語なしで表現できます。さて、これは最初のPrologシステム—で既に使用されていたマイナスリストです。Prolog 0と呼ばれることもあり、Algol-Wで書かれています。 the original report, p.32からの例では、ISOプロローグに訳さ:
t(X-a-l, X-a-u-x).
?- t(nil-m-e-t-a-l, Pluriel).
Pluriel = nil-m-e-t-a-u-x.
だから、基本的に、あなたはどんな左結合演算子を取ります。
しかし、私はそれがあなたが望むものではないと考えています。あなたはおそらくリストを拡張したいでしょう。
これを行ういくつかの試みがありました。もう1つはProlog III/Prolog IVでした。しかし、制約と非常によく似ていますが、これらの演算子に対して等価を定義する方法に直面する必要があります。つまり、構文統一を超えてE-unificationにする必要があります。この問題は当初は簡単に聞こえるが、それは驚くほど複雑である。プロローグIVの簡単な例:
>> L = [a] o M, L = M o [z].
M ~ list,
L ~ list.
明らかにこれは不一致です。つまり、システムは応答する必要がありますfalse.
そのようなM
はありませんが、Prolog IVはこれを推論できません。あなたは少なくともそのような問題を解決しなければならないか、何らかの形でそれらと一緒にいなければなりません。
無料セミグループ、AKADにおける方程式の可解性の問題:
は、ケースであなたは本当にJ. Makaninの先駆的な仕事を始めた研究を検討し、この掘り下げたいです。 Nauk SSSR、それはあなたが望む結果を得るための簡単な方法があることは場合であるかもしれない、と述べvol.233、2番、1977年
。たぶん完全連想リスト演算子は必要ないかもしれません。
しかし、私がPrologで持っているもの、すなわちDCGsに比べて、そのような拡張子からの表現力はあまり期待しないでください。特に、一般的な左回帰は、文法における終了のために依然として問題となる。
'[T〜H]'が 'H'で終わるリストと残りの要素が 'T'のリストにどのようにマッチするかわかりません。実際、それはリストと一致しません: '? - X = [1,2,3]、X = [T〜H]。偽です。 – Fatalize
構文的には異なるが意味的に同じであるため、はい。上で言及したように、[T〜H]は構文の定義にすぎません。これはリストではありません。セマンティクスはルール[T〜H]:〜is_list([H | T])から来ます。これは、[H | T]がリストであるとき、構文[T〜H]が真であるように、[H〜T]がis_list [H | T]ならば、頭部Hと尾部Tを持つリストです。 – coder
私はまだそれがどのように質問に答えるか分かりません。 X = [1,2,3]、X = [T〜H] .'が 'H = 3、T = [1,2]'を返すようなものが欲しい。私が言ったように、コンパイラに触れることなくこれが可能かどうかはわかりません。 – Fatalize