2017-11-11 10 views
1

私は今プロローグを理解しようとしています。私は入力を与えたい:変換(S(S(S(X)))、Y)とする必要があり、出力Y = 3プロローグで整数を返します

convert(s(0), 1). 
convert(s(s(0)), 2). 
convert(s(X),Y) :- convert(X,Y is (Y+1)). 

これらの私のルールは今ですが、入力のみ: 変換する(s(0)、1)。そして、 convert(s(s(0))、2)。作業。

私の再帰が正しく機能するなら、私はルールを必要としません:convert(s(s)(0))、2)。 誰かが私にこの問題を手伝ってもらえますか?

は、ここでは二つの問題があります

答えて

1

挨拶:

  • Y is Y+1は、Prologで任意の理にかなっていませんが。
  • ここに実際にファンクタと書かれていることに注意してください。

    convert(X,is(Y,Y+1)) 
    

    is(Y,Y+1)と呼ばれるが、ファンクタとして渡されていません:

Prologはコールとしてこれを見ています。 Prologでは、明確な入力と出力はありません。あなたは述語を呼び出し、統一を通して結果を得る。

私たちは、しかし、再帰を使用して問題を解決することができます。0convert/2はもちろん0は次のとおりです。

convert(0,0). 

s(X)の変換、Xプラスワンの変換です:

convert(s(X),R) :- 
    convert(X,Y), 
    R is Y+1. 

またはこれらをまとめて:

convert(0,0). 
convert(s(X),R) :- 
    convert(X,Y), 
    R is Y+1. 

これで、すべてのPeano番号とそれに対応する番号をリストし、Peano番号を数値に変換する述語を呼び出すことができます。 Peano番号が通常の番号であるかどうかを検証することもできます。

残念ながら、与えられた番号からPeano番号を取得するためにこの述語を使用することはできません。それはPeano番号と統合されますが、別のPeano番号を検索しようとすると無限ループに陥ります。

我々はこれで私たちを助けるためにclpfdライブラリを使用することができます。

:- use_module(library(clpfd)). 

convert(0,0). 
convert(s(X),R) :- 
    R #> 0, Y #= R-1, 
    convert(X,Y).
+0

おかげで、それは働きます!しかし、なぜRのような大きな手紙を書いておくことが重要なのですか? convert(s(X)、R) しかし、なぜ(s(X)、r)を変換しないのですか? – Runner

+1

@Runner:変数は大文字で始まるので、定数は小文字です。これは規約ではありません(そうしないと、プログラムが不正確になります)。迷惑なことやそれに似たものを鳴らさずに、Prologについていくつかの基本を調べる必要があります。 –

+0

正しいですが、clpfd-versionは多くの一時変数を必要とするため、非常に非効率です。効率的なバージョンはどうですか?ああ、s(X)、確かに。 – false

関連する問題