2016-05-10 3 views
1

私は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) 

私は単純にかかわらず、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を述べてきたように、私の出力は、適切ではない、なぜ私はそれを得ます。 2つの異なるIDで同じ名前 "sam"と "helsen"を探して追加します。

しかし、私は適切なルールを書くことができません。私は本当に助けに感謝します。

おかげ

答えて

2

私のソリューション:forallと各タプルを超える

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)、checkでユニーク$ idを確保します。合計を行うには、$n2の値がforallの前提条件の外にバインドされていないため、Python変数を使用します。 pyke: Notes on Forall and Notany Premises

関連する問題