我正在尝试使用 Z3 对集合中元素的包含和排除进行建模。特别是包含具有不同值的元素,并排除尚未在目标集中的元素。所以基本上我想要一个集合 U 并让 Z3 找到一个集合 U_d ,它只包含具有不同值的 U 元素。
我当前的方法使用量词,但我无法理解如何声明如果元素出现在 U_d 中,我希望始终将它们包含在 U_d 中。
( set-option :produce-models true)
;;; Two simple sorts.
;;; Sets and Zs.
( declare-sort Z 0 )
( declare-sort Set 0 )
;;; A set can contain a Z or not.
;;; Zs can have a value.
( declare-fun contains (Set Z) bool )
( declare-fun value (Z) Int )
;;; Two sets and two Z instances for use in the example.
( declare-const set Set )
( declare-const distinct_set Set )
( declare-const A Z )
( declare-const B Z )
;;; The elements and sets are distinct.
( assert ( distinct A B ) )
( assert ( distinct set distinct_set ) )
;;; Set 'set' contains A but not B
( assert ( = ( contains set A ) true ) )
( assert ( = ( contains set B ) false ) )
;;; Assert that all elements contained by distinct_set have different values unless they're the same variable.
( assert
( forall ( (x Z) (y Z) )
( =>
( and
( contains distinct_set x )
( contains distinct_set y )
( = ( value x ) ( value y ) ) )
( = x y ) )))
;;; distinct_set can contain only elements that appear in set.
;;; In other words, distinct_set is a proper set.
( assert
( forall ( ( x Z ) )
( =>
( contains distinct_set x )
( contains set x ))))
;;; Give elements some values.
( assert ( = (value A) 0 ) )
( assert ( = (value B) 1 ) )
( push )
( check-sat )
( get-value (( contains distinct_set A )))
( get-value (( contains distinct_set B )))
( pop )
它产生的作业是:
sat
((( contains distinct_set A ) false))
((( contains distinct_set B ) false))
我想要的作业是:
sat
((( contains distinct_set A ) true))
((( contains distinct_set B ) false))
我知道将 false 分配给 A 和 B 在逻辑上是正确的分配,但我不知道如何以排除这些情况的方式陈述事情。
也许我没有正确考虑这个问题。
任何建议将不胜感激。:)