4

Prolog で次の 3 つの文をどのように表現できますか?

All summers are warm. If it not summer, then it is winter. Now it is winter.
4

4 に答える 4

5

良い質問です。@larsman(まあ、@FredFooは今だと思います)が正しく言ったように、大きなテーマになる可能性があります。そして彼の答えは確かにとても良いです。

あなたの質問は、カスタム言語 (主な Prolog の使用の 1 つ) の必要性によって引き起こされる可能性があるため、ここではダミーの DSL の構文シュガーを提案します (つまり、現在は完全に空であることを意味します...)

:- op(500, fx, all).
:- op(500, fx, now).
:- op(600, xfx, are).
:- op(700, fx, if).
:- op(399, fx, it).
:- op(398, fx, is).
:- op(397, fx, not).
:- op(701, xfx, then).

all summers are warm.
if it is not summer then it is winter.
now it is winter.

SWI-Prolog は、格納される op を赤くするのに十分親切です。つまり、簡単に照会できます。これらは、宣言された優先順位の高い単語です。つまり、are、then、now です。

?- now X.
X = it is winter.
于 2012-06-07T10:52:55.737 に答える
2

これをどのように表現するかは、どのような推論を行いたいかによって異なります。最も簡単な方法の 1 つは、

warm :- summer.
winter.

「夏でなければ冬」というルールは、実際には有用な推論を行うことを許可しないため、スキップしてもかまいません。含めるとしたら、次のようなものかもしれません

winter :- \+ summer.

しかし、Prolog での否定は失敗としての否定であるため、バニラの命題論理のセマンティクスを期待する場合、これはあなたが思っていることをしないかもしれません。

于 2012-06-07T09:51:07.990 に答える
0
winter(now).

warm(X) :- summer(X). 
summer(X) :- \+ winter(X).
winter(X) :- \+ summer(X).

これを行う方法の1つになります。

実際に:

6 ?- summer(now).
false.
7 ?- summer(tomorrow).
ERROR: Out of local stack
8 ?- warm(now).
false.
于 2012-06-07T09:40:04.147 に答える
0

ここでは、否定を使用せずに解決策を示しています。代わりに、季節の宇宙が指定されています。

season(summer).
season(winter).

now(winter).

warm(S) :-
    season(S),
    S = summer.

クエリの例:

?- now(S).
S = winter ;
false.

?- now(S), warm(S).
false.

?- warm(S).
S = summer ;
false.
于 2014-07-06T13:56:32.437 に答える