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 的主要用途之一)驱动的,因此我在这里提出了虚拟 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 可以将那些被存储的操作设置为红色,即可以轻松查询。这些是声明的优先级较高的词:即 are,then,now。

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

如何表示这取决于您要做出什么推论。最简单的方法之一是

warm :- summer.
winter.

“如果不是夏天,那么冬天”规则实际上不允许您做出任何有用的推论,因此您也可以跳过它。如果要包含它,它可能类似于

winter :- \+ summer.

但是由于 Prolog 中的 negation 是negation as failure,如果您期望 vanilla 命题逻辑的语义,这可能不会像您认为的那样做。

于 2012-06-07T09:51:07.990 回答
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.
于 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 回答