我对PYKE很新,我在PYKE中编写规则时遇到了一个小问题。
我的kfb文件中有以下声明。
var lastModified = (DateTime) doc.Descendants("Item")
.Where(x => (string) x.Element("Id") == "id 2")
.Elements("LastModified")
.Single();
我想写一个产生如下输出的规则:
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)
我只是尝试添加类似的语句而不管ID。
我编写了以下规则,但这会产生不同的输出。
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)
我知道为什么我的输出不正确,因为我已经提到了$ id1和$ id2。在两个不同的ID中查找相同名称“sam”和“helsen”并添加它们。
但是我无法写出正确的规则。我真的很感激任何帮助。
由于
答案 0 :(得分: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)
使用forall
循环遍历每个元组($ f1,$ s1),确保使用check
的唯一$ id。为了做总和,使用python变量,因为$n2
的值没有绑定在forall
前提之外;见pyke: Notes on Forall and Notany Premises