0

私は今プロローグを学ぼうとしていて、再帰のトピックを始めました。後継者のためにこの例に出くわしました。

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

理論的にはどのように機能するかを理解しています。数値 X を取り、 succ はそれをインクリメントします。ここでの私の質問は、 succ は組み込みの述語ですか? または、この例では何か他のことが起こっていますか? Learnprolognow.org からの例

そんな時、このエクササイズに出会いました

pterm(null).
pterm(f0(X)) :- pterm(X).
pterm(f1(X)) :- pterm(X).

バイナリを表すことを意味します。つまり、0 は f0(null)、1 は f1(null)、2(10) は f0(f1(null))、3(11) は f1(f1(null)) などです。この質問では、pterms を使用して、P2 が P1 の後継者になるように述語 (P1, P2) を定義するように求められます。誰かが私のためにこの質問をより詳細に説明できますか? 私が今見ているように、最後に到達するまで P1 をトラバースして戻ってから、それを P2 と比較する必要がありますが、構文については正確にはわかりません。どんなヒントも役に立ちます

4

2 に答える 2

2

succ は複合語であり、組み込みの述語ではありません。

2 つの句を順番に取ると、次のようになります。

numeral(0).

これは、numeric(0) が真であることを意味します。つまり、0 は数字です。

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

これは、number(X) が true であることを示すことができれば、number(succ(X)) が true であることを意味します。

クエリを実行する場合:

?- numeral(succ(succ(0)).

するとプロローグは True を返します: numeric(succ(0)) が true の場合、number(succ(succ(0)) は true です。また、number(0) が true の場合、number(succ(0)) は true です。 (0) は真です。

あなたが尋ねるなら

?- numeral(X).

次に、プロローグは、X=0、X=succ(0)、X=succ(succ(0)) などと応答し、句を満たす用語を見つけます。

あなたのptermの質問に答えるために...

まず、構築する構造について考えます。これは 2 進数で、最も外側の項が最下位ビットです。正しい例を次に示します。

1: succ(f1(null),f0(f1(null))
2: succ(f0(f1(null)),f1(f1(null))
3: succ(f1(f1(null)),f0(f0(f1(null)))

上記の 2 と 3 の例を見ると、関心のある 3 つのケースを導き出すことができるはずです。ヒントとして、最初のケースは、項が f0(X) の形式である場合、後続は f1(X) であるということです。

于 2016-05-03T11:00:19.673 に答える