Prolog规则结构及其区别

Prolog rules structure and its difference

我对应该如何编写我的 Prolog 规则的结构感到困惑。

这么说吧,我想声明只有鸟会飞。

我的规则应该写成

fly(X):- bird(X).

bird(X):-fly(X).

它们的意思有什么区别? 此外,我是否需要明确声明如果实体不是鸟,它就不能飞?

此外,如果我想说... 我可以去动物园或图书馆。要么是动物园要么是图书馆,但不能两者兼而有之。应该怎样? 我假设它是..

go_there(X,Place):-
   go_there(X,zoo),
   go_there(X,library).

请对我温柔一点,因为这是我第一次尝试使用 Prolog 编程!谢谢!

要说只有鸟会飞可以表达为,如果一个生物会飞,那么它一定是鸟。根据这个简洁短语的语义,它可能会留下一些无法飞翔的鸟的可能性。

因此,谓词:

fly(X) :- bird(X).

不正确。这就是说,如果X是一只鸟,那么X会飞,这不是只有鸟会飞[=95] =] 从逻辑上说。

Prolog 更直接的翻译是:

bird(X) :- fly(X).

它说,X是一只鸟,如果X可以飞(或者,如果X可以飞,那么X一定是鸟).

only 的排他性是由于 不存在 表示其他生物可以飞行的任何其他谓词,例如:

bee(X) :- fly(X).

关于第二个问题:

go_there(X,Place):-
   go_there(X,zoo),
   go_there(X,library).

这表示,XPlace 如果 X 去动物园,X 去图书馆.这听起来一点也不像,X 可以去动物园或图书馆,但不能两者都去 。我可以这样说:

go_there(fred, zoo).
go_there(fred, library).

这些说fred可以去动物园,或者fred可以去图书馆

然后如果我查询:

go_there(fred, Place).

它会为 Place 产生两个不同的结果:

Place = zoo
Place = library

要说 X 可以去其中一个,但不能同时去两个,需要限定。这是否意味着在特定时间段内 X 不能同时去?或者这是否意味着一旦 X 进入其中一个,就永远无法进入另一个?上述谓词是否满足第一种情况尚不清楚。这取决于上下文。在任何一种情况下,您都需要添加一些 Prolog 逻辑来处理时间方面,或者,如果 "forever" 情况,您需要随机选择一个或另一个,然后保留该选择从那时起坚持不懈。


在回应其他评论时,如果您说:

go_there(human(fred), zoo).
go_there(human(fred), library).

您选择通过函子 human/1 将一个人(例如 fred)表示为人类。为了将 fred 指定为人类,您必须使用 fred 携带函子,并且在用于查找 [ 的谓词中时始终将 fred 称为 human(fred) =30=]s 是人类的一员。如果你想问 fred 是否去动物园,go_there(fred, zoo). 会失败,不幸的是,因为 fred 是人类这一事实需要成为代表 [=30= 的原子的一部分].你必须查询,go_there(human(fred), zoo)。要确定 fred 是否是人类,您会查询 go_there(human(fred), _). 这也有点尴尬。

分离关系更清晰:

go_there(fred, zoo).
go_there(fred, libary).

human(X) :- go_there(X, zoo).
human(X) :- go_there(X, library).

现在如果你查询,human(fred).,你会得到 "true"。如果你查询,go_there(fred, zoo) 你也会得到 "true".