2016-10-03 3 views
0

Logicbloxでモデル・セットを作成することは可能ですか?具体的には、set of Integers、たとえば{1,4,9}が必要です。セットが空のセットであるか、一部のエレメントがセットに属しているかどうかを確認したいと考えています。Logicbloxでのセット

create --unique 
addblock <doc> 
    my_set(x) -> int(x). 
    my_set_not_empty() <- my_set(_). 
    my_set_empty() <- !my_set_not_empty(). 
</doc> 
echo 'my_set' 
print my_set 
echo 'my_set_empty' 
print my_set_empty 
echo 'my_set_not_empty' 
print my_set_not_empty 
echo 'adding an element' 
exec '+my_set(1).' 
echo 'my_set' 
print my_set 
echo 'my_set_empty' 
print my_set_empty 
echo 'my_set_not_empty' 
print my_set_not_empty 
close --destroy 

をあなたはそれが取るすべては余分にあるエンティティとしてセットをモデル化する場合:1つのセットをモデル化したい場合は、この例のようにそれのための述語を作成できるように

答えて

1

述語は、実際に自然にセットモデルキー:

create --unique 
addblock <doc> 
    integer_set(set),integer_set:name(set:name) -> string(name). 
    contains(set,integer) -> integer_set(set),int(integer). 
    not_empty(set) <- contains(set,_). 
    empty(set) <- !not_empty(set), integer_set(set). 
</doc> 
exec <doc> 
    +integer_set(my_set),+integer_set:name(my_set:"my_set"). 
</doc> 
echo "empty" 
print empty 
echo "not empty" 
print not_empty 
echo "adding elements and creating another set" 
exec <doc> 
    +integer_set(my_set),+integer_set:name(my_set:"other_set"). 
    +contains(my_set,1) <- integer_set:name(my_set:"my_set"). 
    +contains(my_set,4) <- integer_set:name(my_set:"my_set"). 
    +contains(my_set,9) <- integer_set:name(my_set:"my_set"). 
</doc> 
echo "contains" 
print contains 
echo "empty" 
print empty 
echo "not empty" 
print not_empty 

close --destroy 
+0

ありがとうございます。 'addElement [set、int] - > set'のような2次演算も定義できますか。セットと要素を受け取り、別のセットを返します。 – Shambo

+0

あなたはそのような種類のものを定義することができますが、そこに危険な海域に入ることができます。 「別のセットを返す」という最も明白な解釈は、エンティティを作成する再帰的ルールを作成することです。デフォルトではコンパイラによって拒否されるため、非終端の計算につながる可能性があります。 あなたが冒険している場合、コンパイラがそのようなことを受け入れるように強制するプラグマがあります。 –

+0

清算に感謝します。それは確かにかなりトリッキーです。私はそれを試してみるのは間違いありません。あなたが私があなたが言及したプラグマへのいくつかの指針を与えることができるかどうか疑問に思っていた。 – Shambo