1

私は「LearnPrologNow!」に続く Prolog の初心者です。チュートリアルのセット。概念と語彙を把握するために最善を尽くしています。この問題が提示されたとき、再帰的定義に関する第3章までのすべてを理解できました。

numeral(0).
numeral(succ(X))  :-  numeral(X). 

与えられたクエリ

numeral(X).

これで、プログラムの考え方は、Prolog がこのシステムで次のような順序で数を数え始めるということであることがわかりました。

X=0
X=succ(0)
X=succ(succ(0))

しかし、毎回「縮小」して上昇する原因がわかりません。プログラムが X のクエリを統合しようとしているという点で、統合の原則は理解していますが、再帰規則を 1 回だけ実行してからゼロを返す必要がありますか? クエリの周りに succ()を追加できるのは何ですか? それは逆方向に再帰規則をトラバースしていませんか?

4

2 に答える 2

3

宣言的に考えてください:

ルール

numeral(succ(X))  :-  numeral(X).

意味:

Xが数字の場合は succ(X)数字です。

:-は、論理的含意で使用される矢印のようなものです ( に似ています<==)。

それが数字 (最初の答え) であることが正常に導き出されたことを考えると、それが別の解決策であることは0驚くことではありません。succ(0)

実際の制御フローをたどろうとするのではなく、そのような関係の観点から考えることをお勧めします。

succ/1「クエリの周り」に追加されるのではなく、実際の回答の一部であることに注意してください。この用語succ(0)は、 functorsuccと argumentを使用した通常の Prolog 用語0です。

于 2015-03-12T13:14:58.910 に答える
2

すでに回答が得られているので、さらに追加します。

Prolog は、表示構文 (または宣言構文) を使用して、用語間の論理関係/「方程式」を定義します。

用語は、変数/関数/プレースホルダーなどで構成されるオブジェクトです。

統一は、2 つの式 (または 2 つの項) が与えられた関係/方程式に関して等しいかどうかを確認するプロセスです。

numeral(succ(X))  :-  numeral(X)

X変数項がnumeral type(またはクラス)のものであるという事実は、後継汎関数も同じ型であることを意味するというような関係/方程式です。succしたがって、ここで Prolog は、式を統一する (つまり、方程式 を解く) ことができ、 のドメインがカバーされるまでX、などに置き換えます。したがって、この統合は に置き換えられることを意味し、その後、統合を再適用できます。succ(X)XXsucc(X)

于 2015-03-12T13:46:26.620 に答える