Я пытаюсь моделировать включение и исключение элементов в наборах с Z3. В частности, включение элементов с различными значениями и исключение элементов, которые уже не находятся в целевом наборе. Поэтому в основном я хочу иметь множество U и Z3 найти множество U_d, которое содержит только элементы U с различными значениями.Исключение и включение в Z3
Мой текущий подход использует кванторы, но у меня возникают проблемы понимания того, как заявить, что я хочу, чтобы всегда включать в себя элементы в U_d, если они появляются в U.
(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))
I Unders и что назначение false для обоих A и B является логически правильным назначением, но я не знаю, как утверждать вещи таким образом, чтобы управлять этими видами случаев.
Возможно, я не думаю о проблеме правильно.
Любой совет будет очень благодарен. :)
Это утверждение, похоже, именно то, что я искал, спасибо. Кроме того, если я правильно понимаю, это также делает утверждение, которое я имел для обеспечения того, что 'distinct_set' содержит только элементы в 'set' redundant. Мне это нравится. :) – Mintish