1

我对 PYKE 很陌生,在 PYKE 中编写规则有一个小问题。

我的 kfb 文件中有以下声明。

ent_rel(1, sam, helsen,2)
ent_rel(1, sam, dunkin,1)
ent_rel(1, pirate, sam,2)

ent_rel(2, van, helsen,2)
ent_rel(2, sam, helsen,2)
ent_rel(2, pirate, bay,1)
ent_rel(2, van, burger,1)

ent_rel(3, burger, house,1)
ent_rel(3, sam, helsen,1)

我想编写一个产生如下输出的规则:

ent_rel1(sam, helsen,5)
ent_rel1(sam, dunkin,1)
ent_rel1(pirate, sam,2)
ent_rel1(pirate, bay,1)
ent_rel1(van, helsen,2)
ent_rel1(van, burger,1)
ent_rel1(burger, house,1)

我只是想添加类似的语句,而不考虑 ID。

我写了下面的规则,但这给出了不同的输出。

relationship_cnt
    foreach
        a.ent_rel($id1, $f1, $s1, $n1)
        a.ent_rel($id2, $f2, $s2, $n2)
        check $id1 != $id2
        check $f1 == $f2
        check $s1 == $s2
        $tot = $n1 + $n2
    assert
        a.ent_rel1($f1,$s1,$tot)

输出:

ent_rel1('sam', 'helsen', 4)
ent_rel1('sam', 'helsen', 3)

我明白为什么我的输出不正确,正如我提到的 $id1 和 $id2。它在两个不同的 id 中查找相同的名称“sam”和“helsen”并添加它们。

但是我无法编写正确的规则。我真的很感激任何帮助。

谢谢

4

1 回答 1

2

我的解决方案:

relationship_cnt
    foreach
        data.ent_rel($id1, $f1, $s1, $n1)

        python tot = $n1

        forall
            data.ent_rel($id2, $f1, $s1, $n2)
            check $id1 != $id2
            python tot = tot + $n2

        $tot = int(tot)
    assert
        data.ent_rel1($f1, $s1, $tot)

使用 循环遍历每个元组 ($f1, $s1) forall,确保唯一的 $id 使用check. 为了求和,使用python变量,因为for的值$n2没有绑定在forall前提之外;参见pyke:关于 Forall 和 Notany 前提的注释

于 2016-11-17T15:03:41.053 回答