【发布时间】:2019-01-01 09:31:58
【问题描述】:
我对 PROLOG 很陌生,所以这可能是一个非常微不足道的问题,但我绝对没有 想法如何解决它。 我需要将 4 句话写成 PROLOG 代码:
所有的猎犬都在夜间嚎叫。
任何有猫的人都不会有老鼠。
轻睡者没有任何在夜间嚎叫的东西。
约翰有一只猫或一只猎犬。
我在这样的一阶谓词演算中将句子转换为格式良好的公式
- ∀x (HOUND(x) → HOWL(x))
- ∀x ∀y (HAVE(x,y) ∧ CAT (y) → ¬∃z (HAVE(x,z) ∧ MOUSE (z)))
- ∀x (Light_Sleeper(x) → ¬∃y (HAVE (x,y) ∧ HOWL(y)))
- ∃x (HAVE (John,x) ∧ (CAT(x) ∨ HOUND(x)))
现在我不知道如何在 Prolog 中编写它们。
另外,如何查询?
【问题讨论】:
-
第一个子句已经是Horn子句了,可以直接翻译。
-
您可以使用常量,而不是使用谓词来表示猫/鼠标等。第二个子句将变为
∀x ( Have(x,cat) → ¬ Have(x, mouse) ),但它仍然不是 Horn 子句。与其定义规则,不如将其表示为查询∀x ¬( Have(x,cat) ∧ Have(x, mouse) ),但这需要否定。因为 Prolog 只实现了negation as failure,所以只有当Have(x,y)有有限多个解时,翻译才是正确的。 -
第四个子句的措辞暗示约翰有一只猫或一只狗,但不是两者兼有。如果是这样,那么您需要明确说明。