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).
这表示,X
去 Place
如果 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".
我对应该如何编写我的 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).
这表示,X
去 Place
如果 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".