如何在Prolog中表达接下来的3个句子?
All summers are warm. If it not summer, then it is winter. Now it is winter.
答案 0 :(得分:4)
好问题。 正如@larsman(嗯,@FredFoo现在,我认为)正确地说,可以是一个大的主题。他的回答确实非常好。
由于你的问题可能是由于需要一种自定义语言(Prolog主要用途之一)所驱动的,所以我在这里提出虚拟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非常友好地将那些存储的操作变为红色,即可以轻松查询。这些是声明的更高优先级的词:即,然后,现在。
?- now X.
X = it is winter.
答案 1 :(得分:2)
如何表示这取决于您想要进行的推断。最简单的方法之一是
warm :- summer.
winter.
“if not summer then winter”规则实际上并不允许您做出任何有用的推论,因此您也可以跳过它。如果你要包含它,它可能类似于
winter :- \+ summer.
但由于Prolog中的否定是negation as failure,如果您期望vanilla命题逻辑的语义,这可能不会像您认为的那样。
答案 2 :(得分:0)
winter(now).
warm(X) :- summer(X).
summer(X) :- \+ winter(X).
winter(X) :- \+ summer(X).
这将是实现此目的的方法之一。
行动中:
6 ?- summer(now).
false.
7 ?- summer(tomorrow).
ERROR: Out of local stack
8 ?- warm(now).
false.
答案 3 :(得分: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.