1

私は次のプロローグプログラムを持っています:

set_1(2).
p(X) :- set_1(X+1).

i386 用の SWI-Prolog バージョン 5.10.4 を使用して、このプログラムでクエリ p(1) を実行しています。

答えは「偽」です。

set_1(X+1) は set_1(2) として接地し、最初の事実で解決する必要があるため、答えは「true」になると思います。

答えが偽である理由と、「真」を得るにはどうすればよいですか?

4

1 に答える 1

2

例で 2 と統合する場合X+1は、 を使用してこれをコーディングする必要がありますis/2

それ自体X+1は有効な Prolog 用語ですが、 をXと統合しても1、用語は になり1+1、期待したものではなくなり2ます。

代わりに試してください:

p(X) :- Y is X+1, set_1(Y).

追加:算術式を評価する際の Prolog の極端な「怠惰」により、述語を単純な事実ではなく規則にする必要があるという犠牲を払っp/1て、評価の責任を に押し下げることができることを指摘する価値があるでしょう。set_1/1

1 ?- [user].
|: set_1(X) :- 2 is X.
|: p(X) :- set_1(X+1).
|: {Ctrl-D}
% user://1 compiled 0.00 sec, 3 clauses
true.

2 ?- p(1).
true.

述語is/2は、算術式の評価を強制する唯一の SWI-Prolog 組み込みではありません。完全な概要については、こちらを参照してください。特定の述語=:=(中置表記を使用) では、2 つの式の評価が等しいかどうかを比較すると、場合によっては役立つことがあります。

于 2013-09-09T02:41:28.997 に答える