2

Windows 7 で SWI-Prolog V 6.2.3 を使用しています。整数の絶対値と 2 乗を計算する次の述語を作成しました。

myabs(X,X):- X > = 0.

myabs(X,Y):- Y is -X.

mysq(X,S):- myabs(X,Y), S is Y * Y.

次の行でエラー (オペレーター エラー) が発生します。

2 : Prolog は -X を受け入れないようです。

3 : Prolog は Y * Y を受け付けないようです (2 * 2 に置き換えた場合、エラーは発生しません)

これらの関数には組み込みの述語があることは理解していますが、私は初心者なので、これらは学習に役立つ小さなプログラムです。

4

2 に答える 2

3

ルール1にタイプミスがあります:後のスペースを削除します>

myabs(X,X):- X >= 0.
myabs(X,Y):- Y is -X.
mysq(X,S):- myabs(X,Y), S is Y * Y.

次に、修正後:

?- mysq(-3,X).
X = 9.

スクエアリングにmyabsが必要ないことをご存知ですか?

?- X = -3, Y is X*X.
X = -3,
Y = 9.

@falseに記載されているように編集します。また、入力が正バックトラックが含まれる場合に誤った結果を防ぐために、myabs/2も修正する必要があります。2番目の句にガードを追加すると、次のことが可能になります。

myabs(X, Y):- X < 0, Y is -X.

しかし、私はif / then / else構文を好みます。つまり、これらの2つの句を次のように置き換えます。

myabs(X, Y) :- X >= 0 -> Y is X ; Y is -X.
于 2013-01-04T23:59:23.087 に答える
2

構文エラーとは別に: の定義は数値の絶対値を計算myabs/2しません。つまり、それを計算しますが、さらに何か間違ったことをします!

?- myabs(2,Abs).
Abs = 2 ;
Abs = -2.

つまり、2 の絶対値は2 と -2の両方であるということですが、これは確かに正しくありません。

Prolog は各ルールを使用してソリューションを個別に導出します。つまり、各ルールを単独で読むことができます。ルールを相互に依存させる方法はいくつかありますが、ここでは単純にしておきましょう。2 番目のルールは次のとおりです。

myabs(X,Y):- Y is -X.

の絶対値Xは、否定されXた です。何Xがあっても。したがって、この規則は であることにも適用さX2ます。Xここでは、さらに負の条件が必要です。

初心者として、see library(clpfd)の代わりに使用することをお勧めします(is)/2

于 2013-01-05T13:43:50.723 に答える