Правила PYKE для добавления количества похожих операторов

Я очень новичок в 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)

Я просто пытаюсь добавить подобные заявления независимо от идентификатора.

Я написал правило ниже, но это дает другой вывод.

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)

Ouput:

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

Я понимаю, почему мой вывод неверен, так как я упомянул $id1 и $id2. который ищет одно и то же имя "sam" и "helsen" в двух разных идентификаторах и добавляет их.

Однако я не могу написать правильное правило. Я бы очень признателен за любую помощь.

Спасибо

1 ответ

Решение

Мое решение:

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, обеспечивая уникальные идентификаторы $ с check, Чтобы сделать сумму, используйте переменную python, потому что значение для $n2 не связан вне forall помещение; см. Пайк: заметки о Форалле и Нотани

Другие вопросы по тегам