Prolog中的逻辑运算

4

如何在Prolog中表达下面三个句子?

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

这是作业吗?如果是,请打上标签。 - LiKao
1
我不太记得语法,但从我的理解来看,您正在寻找一种定义全称量词/存在量词的方法。这个文本可能会对您有所帮助,让您开始着手处理。 - dirkgently
在Prolog中,有无数种表示方法。你尝试过什么? - Fred Foo
larsman,你能展示一下最简单的方法吗? 这不是作业。 - user721588
@dirkgently:感谢提供链接,很有趣! - CapelliC
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很友好地将被存储的op标红,也就是说可以轻松查询它们。这些是已声明的高优先级关键词:即are、then和now。

?- now X.
X = it is winter.

2
如何表示这取决于您想要做出什么样的推论。其中一种最简单的方法是:
warm :- summer.
winter.

“如果不是夏天,那就是冬天”的规则实际上并没有让你得出任何有用的推论,因此你可以直接跳过它。如果你想要包含它,可能会写成这样:”
winter :- \+ summer.

但是,由于Prolog中的否定是失败的否定,如果您期望香草命题逻辑的语义,那么这可能不会产生您所期望的结果。

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.

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.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接