1

假设我有以下陈述:

A p B, A p C, B p C  ( p is a symmetric property, i.e.  B p A, C p A and C p B)
A v 2, B v 1, C v 1,

我想使用规则来执行以下操作:

?a p all(?b)
if ?b v 1
than ?a q 'Yes'

这意味着您可以推断(A q 'Yes'),但 B 不能,因为 B p A 和 A v 2(尽管 B p C 和 C v 1)。

[rule: (?a eg:p ?b), (?b eg:v 1) -> (?a eg:q 'Yes')]

我在耶拿使用了上述规则,但我得到了 A,B,C eg:q 'Yes',这是错误的。任何帮助将不胜感激。

更新(最初作为答案发布)

(?ap all(?b)) 的意思是我喜欢得到一个集合,这个集合中的所有?mem 都满足(?ap?mem)。并且所有成员必须满足 (?mem v 1) 才能推断 (?aq 'Yes')。

例如,

A p B 和 A p C,所以我得到一个包含 (B, C) 的集合。因为 B 和 C v 1,所以 A q '是的。

B p A 和 B p C,所以我得到一个集合(A,C),但是 A v 2,所以不能推断 B q '是'。

问题解决了

感谢约书亚泰勒。

首先,这两个规则不能同时使用。rule2应该在rule1之后使用。

而且,rule2 应该是 [rule2: (?s ?p ?o) noValue(?s, connectedToNonOne) -> (?sq 'Yes')]。

4

1 回答 1

1

但我得到了 A、B、C 例如:q 'Yes',这是错误的。

你实际上在耶拿写的规则说

        对于任意两个个体 X 和 Y,如果(X p Y) 和 (Y v 1)(X q 'Yes')。

根据您编写的规则,这是正确的,通过:

        (A p C),(C v 1)→(A q'是')
        (B p C),(C v 1)→(B q'是')
        (C p B),(B v 1)→ (C q'是')

你实际上想说的是:

        对于任何个体 X,如果对于每个个体 Y,(X p Y)意味着(Y v 1),那么(X q 'Yes')。

在一阶逻辑中,您的原始规则可以写成:

        ∀ x,y ([p(x,y) ∧ v(y,1)] → q(x,'yes')

你实际上想要捕捉的是:

        ∀x[(∀y[p(x,y) → v(y,1)]) → q(x,'yes')]

这在耶拿规则中更难捕捉,因为要检查 (∀y[p(x,y) → v(y,1)]) 是否成立,耶拿所能做的就是检查当前是否有反例。如果后来添加了一个,您可能会有不正确的推论。

使用规则推理器中可用的内置函数,您可以使用noValuenotEqual执行以下操作:

#-- If an individual is disqualified by being
#-- connected to a something that is connected
#-- to something that is not equal to 1, then 
#-- add a connectedToNonOne triple.
[rule1: 
  (?x p ?y), (?y v ?z), notEqual(?z,1)
  ->
  (?x connectedToNonOne true)]

#-- Mark everything that is *not* disqualified
#-- with `q 'Yes'`.
[rule2:
  noValue(?x, connectedToNonOne)
  ->
  (?x q 'Yes')
于 2015-05-03T13:11:26.867 回答