これは、理由はプロローグで統一プロセスとプロローグ内のリストがリンクリストであるという事実の作品。
まず、リストが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 = 3
とZ = qux(Y)
とX
とY
は "インスタンス化されていない変数"です。
我々はこれら二つを組み合わせた場合、私たちははあなたのコードのバリアントは次のようになり脱糖ことを参照してください。
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節が成功するということです。
それは最初の部分を説明します、2番目の部分で助けてもらえますか? – Anton