2016-10-03 77 views
0

是否可以在Logicblox中對設置進行建模?具體來說,我想要一個set of Integers,比如說{1,4,9},並且想要檢查該集是否爲空集,以及是否某個元素屬於該集。在Logicblox中設置

回答

1

謂詞實際上自然模型設定,所以如果你想要一組模型,你可以爲它創建一個謂語在這個例子:

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 

如果您要建模集作爲實體所需要的是一個額外的關鍵:

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'這樣的二階操作,它接受一個集合和一個元素,並返回另一個集合。 – Shambo

+0

你可以定義那種東西,但你在那裏進入危險的水域。 '返回另一組'的最明顯的解釋將涉及編寫一個遞歸規則來創建一個實體,默認情況下它將被編譯器拒絕,因爲它可能導致非終止計算。 如果你覺得冒險,有一個編譯器可以強制編譯器接受這樣的事情。 –

+0

非常感謝您的澄清。這確實非常棘手。我一定會喜歡嘗試一下。我想知道你能不能給我一些你提到的編譯指示。 – Shambo