2012-03-09 17 views
1

、変数の場所を変更するには、次のことを行うことが可能です:プロローグVAR交換

A(C、Y、V):= A(Y、C、V)

リストを使用せずにプロローグでこれをコード化する方法はありますか?

ありがとうございます。

+0

この質問は統一し、あなたの意図ではない場合には、これはプロローグではない、 '_predicate_のようなA /を3'扱うことです、そして、私を参照してください。もっと何か... – CapelliC

+0

を説明してください投稿... – sharky

答えて

2

概念は実際にPrologに存在しません。ある変数がある値に束縛されると、文字通り変数ではなくなります。それが結ばれたものになる。

だから、統一と呼ばれています。あなたがやりたいために

、あなたのような何か実行する必要があります。

スワップ((C、Y、V)、(Y、C、Vを))。

あなたは、いくつかの参考資料をピックアップすることがあります:

  • Programming In Prolog。ウィリアムClocksinとクリストファーメリッシュ。おそらくPrologのための最良の入門書です。
  • The Art of Prolog。レオン・スターリングとエフード・シャピロ。個人的には、これはClocksinとMellishよりも有用だとわかりました。

    Cover: The Art of PrologCover: Programming in Prolog

  • は、これらの本は、面白そうに見えます。リチャードO'Keefe。
  • Clause and Effect: Prolog Programming for the Working Programmer。 William Clocksin。あなたは(私はあなたがこのプロローグで行うことができる方法を求めているならば、あなたは次のようになり仮定のだ)Prologの述語としてAを治療している場合、それは確かです:ちょうど考え

Cover: The Craft of PrologCover: Clause and Effect

+0

投稿に感謝します。しかし、それは機能なしでそれをすることは可能ですか?私は単純な置換を探しています。 –

+1

Prologには機能がありません。または置換。ひとたび何かが統一されると、統一を取り戻して取り消すまで、一定の価値があります。あなたは本当にPrologを読む必要があります。あなたが本を望まないなら、プロローグチュートリアルがそこにたくさんあります。あなたは、プロローグの方法で考えることを学ぶ必要があります。これは、Algolの手続き型言語Algolのいずれかとは明らかに異なるものです。— C、C++、Cobol、Adaなどです。あなたが本を望んでいない場合は、そこに無料のチュートリアルがあります。 –

+0

"参考資料"はSWI Prolog、GNU Prologなどとなります。上記は、独自の範囲を持つ単なる「テキストブック」であり、そのほとんどは製品ニュートラルです。 ISO標準BTWもあります。 –

0

次のように表現することができます。

'A'(C, Y, V) :- 'A'(Y, C, V). 

これは実際のPrologの構文です。これは、最初の2つの引数の順序を逆にする述語'A'/3を定義します。しかし実際には、そのような述語は、'A'/3の解釈を無限ループに強制するため、Prologプログラムを非常に遠くにすることはありません。あなたは、単にたい場合

しかし、すべての事実は'A'(Y, C, V)に一致挿入するという意図を反映し'A'/3用語を格納するデータベースも(何らかの理由で)'A'(C, Y, V)に一致する別の事実と関連している次のように、それは、実際に可能である:

与え、これを実行
'A'(c, y, v). 
'A'(C, Y, V) :- 'A'(Y, C, V). 

:これはあなたに別のバインディングを与えるためにバックトラックを継続することに注意...

?- 'A'(X,Y,Z). 
X = c, 
Y = y, 
Z = v ; 
X = y, 
Y = c, 
Z = v 

は無限にであり、これはそれほど有用ではない。しかし、このプログラムで特定の'A'/3の事実が存在するかどうかをテストする必要がある場合は、once('A'(X,Y,Z))(プロローグに組み込まれているonce/1がある場合)または化合物のサブゴール'A'(X,Y,Z), !のいずれかを使用できます再帰的定義の前に、'A'/3の1つ以上のファクトがアサートされます。

あなたは純粋な機能パラダイムのように動作する(非バックトラック)プロローグで;-)

1

けれども、私は、本当のPrologのプログラムでは、このいずれかを行って、実際にはお勧めしません:あなたの状態はで暗黙的ではありませんあなたの変数の値ではなく、あなたの変数の名前で明示的です。つまり、国家の暗黙の変化はなく、むしろ明示的な国家の進歩を意味します。すなわち、

swap([Y2,C2],[Y,C]) :- [C2,Y2] = [Y,C]. 

あなたは

swap([Y2,C2], [Y,C]). 

のようにそれを呼び出すと、あなたが前にY,Cを使用どこY2,C2を使用しています。つまり、あなたは以前のバージョンと現在のバージョンの両方を持っていますが、これからは後者のバージョンだけを使用します。私はあなたが「リストなし」と言ったことを知っていますが、それは目/指で簡単にするための構文的な詳細です(ここに丸い括弧を使うこともできます)。

また、あなただけ(あなたが不可欠でを設定しますようにあなたがそれを介して値を交換する第三VARは必要ありません)あなたのコード内で直接同じ効果のため

[C2,Y2] = [Y,C], .... 

を書くことができます。

また、Ivan BratkoとThe Art of Prologの非常に明快で明瞭な本を心からお勧めします。 "Craft"は非常にです。です。また、 "Clause"はいくつかの例に焦点を当てています。

Cover: Prolog Programming for Artificial Intelligence http://ecx.images-amazon.com/images/I/41VSbrQBSxL._SS500_.jpg