【问题标题】:Prolog Exists FunctionProlog 存在函数
【发布时间】:2012-03-15 21:38:56
【问题描述】:

我需要在序言中写下这些一阶语句。它们应该怎么写? red(X) 应该返回 false,green(X) 应该返回 false,green(X) 或 red(X) 应该返回 true

我已经有了这个代码:

% Assigning Facts

apple(a).
apple(b).
orange(c).
pear(d).
carrot(e).
onion(f).
pepper(g).
% Assigning Rules

red(X) :- apple(X).
green(X) :- apple(X).

fruit(X) :- apple(X).
fruit(X) :- orange(X).
fruit(X) :- pear(X).

vegetable(X) :- carrot(X).
vegetable(X) :- pepper(X).

tasty(X) :- fruit(X).
tasty(X) :- carrot(X).
tasty(X) :- not(onion(X)).

vegetable(X) :- not(tasty(X)).

【问题讨论】:

  • tasty/1 和vegetable/1 在参数未绑定时将不起作用,因此它们也不能用于下面的“存在”解决方案中。
  • 你的前两行说每个苹果都是红色和绿色的。可能不是你想要的。

标签: prolog


【解决方案1】:

你已经知道的 Prolog 中的 'exists' 方法是什么?

怎么样:

red(X).               % ∃x Red(x)
green(X).             % ∃x Green(x)
(red(X) ; green(X)).  % ∃x Red(x) v Green(x)

Prolog 将枚举满足每个调用的Xfail trying 的绑定。如果您只是想测试它们的存在而不是收集绑定,则可以忽略该变量并在第一个绑定之后剪切,如下所示:

red(_), !.

您还问过如何测试某事物是完全是红色还是绿色,而不是两者兼而有之。试试这个:

((\+ red(X), green(X)) ; (red(X), \+ green(X)).  % ∃x Red(x) ⊻ Green(x)

其中 表示exclusive-or (XOR)

【讨论】:

  • 当我查询 red(X) 时。我得到了一个,如果它是红色(X),我希望它返回 false。如果它是绿色(X)。 .只有当它是红色(x)或绿色(x)时才应该是真的
  • 那你要((\+ red(X), green(X)) ; (red(X), \+ green(X)))
  • 能否请您解释一下这是在做什么,因为我是 prolog 中的新手
  • 这给了我:红色(X)。 X = 一个
  • 是的,这就是 Prolog 枚举X 的绑定的意思:谓词red(X) 的解决方案是单个a,这意味着∃x Red(x) 为真,当x 为@987654333 时@。如果 Prolog 找不到任何可以绑定到 X 的东西,那么谓词 red(X) 将失败,并且可能被解释为 false(根据 negation as failure)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-27
  • 2010-11-29
  • 1970-01-01
相关资源
最近更新 更多