Prolog で次の 3 つの文をどのように表現できますか?
All summers are warm. If it not summer, then it is winter. Now it is winter.
良い質問です。@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.
これをどのように表現するかは、どのような推論を行いたいかによって異なります。最も簡単な方法の 1 つは、
warm :- summer.
winter.
「夏でなければ冬」というルールは、実際には有用な推論を行うことを許可しないため、スキップしてもかまいません。含めるとしたら、次のようなものかもしれません
winter :- \+ summer.
しかし、Prolog での否定は失敗としての否定であるため、バニラの命題論理のセマンティクスを期待する場合、これはあなたが思っていることをしないかもしれません。
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.
ここでは、否定を使用せずに解決策を示しています。代わりに、季節の宇宙が指定されています。
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.