2016-10-26 3 views
2

Prologでは、はHで始まり、残りの要素はリストT(内部では'.'(H, '.'(…))と表示されます)にあるリストです。Prologでのカスタムデータ構造の構文

同様の方法で新しい構文を定義することはできますか?たとえば、[T~H]Hで終わり、残りの要素がリストTにあるリストであることを定義できますか?述語の先頭と本文に[H|T]というように自由に使用できますか?例えば、以下を定義することも可能である。 <H|T>はリストとは異なる構造になっていますか? operatotが接尾辞、接頭辞またはインフィックスを使用する場合

答えて

2

あなたの質問を文字通り解釈できます。リストのようなデータ構造。テールへのアクセスは補助述語なしで表現できます。さて、これは最初の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に比べて、そのような拡張子からの表現力はあまり期待しないでください。特に、一般的な左回帰は、文法における終了のために依然として問題となる。

1

それはISO述語優先順位は、0から1200の間の数である

:- op(Precedence, Type, Name). 

とプロローグの構文を拡張または再定義することが可能である、タイプ記述:

infix: xfx, xfy, yfx 
prefix: fx, fy 
suffix: xf, yf 

最後に名前はオペレータの名前です。

オペレータ定義はオペレータの意味を指定するのではなく、構文をどのように使用できるかを記述するだけです。これはPrologの構文を拡張した定義にすぎません。述語がいつ成功するかについての情報は提供していません。したがって、述語がいつ成功するかを記述する必要もあります。あなたの質問に答えるために、例を挙げてみましょう。

:- op(42, xfy, [ ~ ]). 

ここで、中置演算子[〜]を宣言します。これはリストの表現ではありません(まだ)。それはとてもではないこともHで終わるリストで[T〜H]を一致する

[T ~ H]:-is_list([H|T]). 

と残りの要素は、リストTにある

注:あなたは、句を定義することができますオペレータ を定義すると安全です。[ ]またはのように、既存の機能を上書きするためです。 たとえば、[ファイル]のようなファイルを参照する場合。これは演算子を再定義したために falseを返します。

+1

'[T〜H]'が 'H'で終わるリストと残りの要素が 'T'のリストにどのようにマッチするかわかりません。実際、それはリストと一致しません: '? - X = [1,2,3]、X = [T〜H]。偽です。 – Fatalize

+0

構文的には異なるが意味的に同じであるため、はい。上で言及したように、[T〜H]は構文の定義にすぎません。これはリストではありません。セマンティクスはルール[T〜H]:〜is_list([H | T])から来ます。これは、[H | T]がリストであるとき、構文[T〜H]が真であるように、[H〜T]がis_list [H | T]ならば、頭部Hと尾部Tを持つリストです。 – coder

+0

私はまだそれがどのように質問に答えるか分かりません。 X = [1,2,3]、X = [T〜H] .'が 'H = 3、T = [1,2]'を返すようなものが欲しい。私が言ったように、コンパイラに触れることなくこれが可能かどうかはわかりません。 – Fatalize