【问题标题】:Prolog rules structure and its differenceProlog规则结构及其区别
【发布时间】:2015-01-25 19:16:30
【问题描述】:

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

比方说,我想说只有鸟会飞。

我的规则应该写成

fly(X):- bird(X).

bird(X):-fly(X).

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

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

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

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

【问题讨论】:

  • 这并不是 SWI Prolog 特有的,是吗?
  • @lurker,我在 SWI-prolog 中的代码存在一些未解决的问题。我希望有人能指出我在逻辑上出错的地方......你认为你可以在这里帮忙吗? :)
  • 如果您的代码有其他具体问题,您能否将其表述为可以在 stackoverflow.com 上发布的另一个问题?
  • 我将把它表述为另一个问题并编辑这篇文章。这样会好吗?
  • 您应该创建一个新问题,而不是在此问题上添加更多内容。否则,它将混淆该线程中的整个问题/答案序列。如果您需要参考这个问题,可以在新问题中使用超链接。

标签: prolog rules


【解决方案1】:

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

因此,谓词:

fly(X) :- bird(X).

不会是正确的。这就是说,如果X 是一只鸟,那么X 可以飞,这不是逻辑上的只有鸟会飞 所说的。

更直接的 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 逻辑来处理时间方面,或者,如果是“永远”的情况,您需要随机选择一个或另一个,然后让该选择从那个点向前。


回应额外的cmets,如果你说:
go_there(human(fred), zoo).
go_there(human(fred), library).

您选择通过函子 human/1 将一个人(例如 fred)表示为人类。为了将fred 指定为人类,您必须将函子与fred 一起携带,并且在用于寻找freds 人类成员资格的谓词中时始终将fred 称为human(fred) .如果你想问fred 是否去动物园,很遗憾,go_there(fred, zoo). 会失败,因为fred 是人类这一事实需要成为代表fred 的原子的一部分。您必须查询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).,您会得到“真”。如果你查询,go_there(fred, zoo) 你也会得到“真”。

【讨论】:

  • 也许我应该问这样的问题,人类可以是女性也可以是男性。从来不是两者兼而有之。大声笑。
  • 如果我这样问,对上面的规则有影响吗?
  • 我可以确定.. go_there(Human(X),zoo)。去那里(人类(X),图书馆)。也等价于 Human(X) :- go_there(X,zoo)。人类(X):-去那里(X,图书馆)。 ?我在这里试图描述为知识的是,如果有任何东西去动物园或图书馆,它就属于人类阶级......我做错了吗?
  • @user3004159,可能是拼写错误,但 Prolog 中的函子必须以小写字母开头。所以你不能拥有Human(X)。这个讨论太长了,无法评论,所以我会更新我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
相关资源
最近更新 更多