0
是否可以在Logicblox中對設置進行建模?具體來說,我想要一個set of Integers
,比如說{1,4,9}
,並且想要檢查該集是否爲空集,以及是否某個元素屬於該集。在Logicblox中設置
是否可以在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
如果您要建模集作爲實體所需要的是一個額外的關鍵:
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
非常感謝您的解決方案。我想知道是否也可以定義像addElement [set,int] - > set'這樣的二階操作,它接受一個集合和一個元素,並返回另一個集合。 – Shambo
你可以定義那種東西,但你在那裏進入危險的水域。 '返回另一組'的最明顯的解釋將涉及編寫一個遞歸規則來創建一個實體,默認情況下它將被編譯器拒絕,因爲它可能導致非終止計算。 如果你覺得冒險,有一個編譯器可以強制編譯器接受這樣的事情。 –
非常感謝您的澄清。這確實非常棘手。我一定會喜歡嘗試一下。我想知道你能不能給我一些你提到的編譯指示。 – Shambo