我对我的Prolog规则的编写方式感到困惑。
让我们说,我想说只有鸟才能飞。
我的规则应该写成
fly(X):- bird(X).
或
bird(X):-fly(X).
他们之间的意义有什么不同? 此外,我是否需要明确说明如果实体不是鸟,它就不会飞?
另外,如果我想说... 我可以去动物园或图书馆。动物园或图书馆,但不是两者。应该怎么样? 我假设它是..
go_there(X,Place):-
go_there(X,zoo),
go_there(X,library).
请温柔地对待我,因为这是我第一次尝试使用Prolog编程!谢谢!
答案 0 :(得分:1)
要说只有鸟可以飞可以表示为,如果一个生物可以飞行,那么它必须是一只鸟。根据这个简洁短语的语义,它可能会留下一些无法飞行的鸟类的可能性。
因此,谓词:
fly(X) :- bird(X).
不正确。这就是说,如果X
是一只鸟,那么X
可以飞,这不是只有鸟可以飞所说的逻辑。
对Prolog的更直接的翻译将是:
bird(X) :- fly(X).
它说, X
是X
可以飞的鸟(或如果X
可以飞,那么{{1}必须是一只鸟)。
仅的排他性将由于任何其他谓词的缺席而发生,该谓词表示某些其他生物可以飞行,例如:
X
关于第二个问题:
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
进入一个,那么它永远不会去另一个?上述谓词是否满足第一个案例尚不清楚。这取决于具体情况。在任何一种情况下,您都需要添加一些Prolog逻辑来处理时间方面,或者,如果"永远"如果您需要随机选择其中一个,那么从那一点开始,该选择将保持不变。
<小时/> 如果您要回答其他评论,请说:
X
您选择通过仿函数go_there(human(fred), zoo).
go_there(human(fred), library).
代表某人(例如fred
)作为人类。为了将human/1
指定为人类,您必须使用fred
携带仿函数,并且只要在正在查找的谓词中使用fred
时fred
human(fred)
{1}}成为人类的成员。如果你想询问fred
是否会去动物园,遗憾的是fred
会失败,因为go_there(fred, zoo).
是人类的事实需要成为代表{{1}的原子的一部分}。您必须查询fred
。要确定fred
是否为人,您会查询go_there(human(fred), zoo)
,这也有点尴尬。
分离关系更清晰:
fred
现在,如果您查询go_there(human(fred), _).
,则会得到&#34; true&#34;。如果您查询go_there(fred, zoo).
go_there(fred, libary).
human(X) :- go_there(X, zoo).
human(X) :- go_there(X, library).
,您也会得到&#34; true&#34;。