2017-05-09 15 views
0

私は非常にプロローグの新人です。私の教授は、クラスの基本的な使い方を忘れてしまったようです。SWI-Prolog述語

その後、テストコードのstmt([他の利用、X、何か、]、[何か他のものを、])を渡し
stmt([pass|X], X). 
stmt([declare,N|X], X) :- atom(N). 
stmt([use,N|X], X) :- atom(N). 

:彼は私たちに最初の述語は次のように見ていると、STMTおよびSTMTS述語を作成する作業を行いました。

第2の部分は次のようになります。

は次に(List1)(STMTS)と一致原子と開始非終端記号とはList2の原子を継続する場合{stmts(List1, List2)}が証明可能であるようSTMTS述語を定義します。たとえば、次のクエリでは、真を生成する必要があります。 stmts([pass,use,x,more,stuff],[more,stuff])

これを正しく機能させるにはどうすればよいかわかりません。どんな助けもありがとう。

答えて

0

これは、理由はプロローグで統一プロセスとプロローグ内のリストがリンクリストであるという事実の作品。

まず、リストがCONS-wayに実装されていることを理解すると便利です(これは、正しくリコールすれば、Lispに由来します)。これは、ファンクタがあることを意味します(簡略化のためcons/2を使用しましょう)。[use,x,something,else]というリストは、cons(use,cons(x,cons(something,cons(else,nil))))nilがリストの最後です)のように構成されています。リンクされたリストのように。

次の場合、「Prologで述語を呼び出します」統一が発生します。これは、呼び出しの引数をその節の先頭にある引数と統一することを目指しています。たとえば、クローザーの頭部がfoo(bar(X,qux(Y)))で、それをfoo(bar(3,Z))と呼ぶと、X = 3Z = qux(Y)XYは "インスタンス化されていない変数"です。

我々はこれら二つを組み合わせた場合、私たちははあなたのコードのバリアントは次のようになり脱糖ことを参照してください。

stmt(cons(pass,X), X). 
stmt(cons(declare,cons(N,X)), X) :- atom(N). 
stmt(cons(use,cons(N,X)), X) :- atom(N). 

だから今我々はstmt(cons(use,cons(x,cons(something,cons(else,nil)))),cons(something,cons(else,nil))).を呼び出す場合統一が起こります。最初のPrologは、最初の節との統合を目指しています:

stmt(cons(pass,X),   X) 
stmt(cons(use, cons(x,...),cons(something,cons(else,nil))) 

(私は単純な形で楕円を使用しました)

cons(pass,X) ~ cons(use,cons(else,...)) 
X ~ cons(something,cons(else,nil)) 

統一意志:そう、最初の統一を削除し、引数の統一を注入:

pass ~ use 
X ~ cons(else,...) 
X ~ cons(something,cons(else,nil)) 

統一は次のように、最初の引数を統一することを目指します

現在、プロローグpassおよびuseの定数です(これらは小文字で始まるため)。さらに、Prologのすべての定数は、とは異なり、です(ただし、「名前」が同じである場合を除きます)。だからpass ~ useは統一できません。最初の句は「失敗」します。

Prologでバックトラッキングメカニズムがあります。最初の句がコールされた後 - それが成功か失敗かに関係なく、Prologは2番目の句、3番目の句などでコールを再試行します。

これで、通話を統一することを目指しています。再び我々は

cons(declare,cons(N,X)) ~ cons(use,cons(x,...)) 
X ~ cons(something,cons(else,nil)) 

declare ~ use 
cons(N,X) ~ cons(x,...) 
X ~ cons(something,cons(else,nil)) 

し、再びそれが失敗しているように統一につながる

stmt(cons(declare,cons(N,X )),X) 
stmt(cons(use, cons(x,...)),cons(something,cons(else,nil))) 

:だから今、私たちはのような統一を行います。

私たちの最後の試みである:得

stmt(cons(use,cons(N,X)) ,X). 
stmt(cons(use,cons(x,...),cons(something,cons(else,nil))) 

cons(use,cons(N,X)) ~ cons(use,cons(x,...)) 
X ~ cons(something,cons(else,nil)) 

とし、その後利回り:

use ~ use 
cons(N,X) ~ cons(x,...) 
X ~ cons(something,cons(else,nil)) 

に結果:

use ~ use 
N ~ x 
X ~ ... 
X ~ cons(something,cons(else,nil)) 

...cons(something,cons(else,nil)))です。だから今統一はが成功した、ハレイ。しかし、私たちはまだそこにいません。今度はという3番目の句の先頭が成功しました。つまり、その句の本文でコールを実行する必要があります。だから我々が呼ぶ:

atom(N). 

N = xいるので、それは我々がxを呼び出すこと。今度はatom(x)が組み込みであり、成功しました(ここでは再び統一プロセスを行うつもりはありません)。つまり、第3節が成功するということです。

+0

それは最初の部分を説明します、2番目の部分で助けてもらえますか? – Anton