我一直在尝试使用 Z3 SMT Solver 定义一个三值命题逻辑和推理。更准确地说,我用三个值定义了一个排序布尔值:TRUE、FALSE 和 NULL,并带有一些断言。
(declare-sort Boolean 0) ;I declare a sort Boolean
(declare-const TRUE Boolean) ;I define three constants
(declare-const TRUE Boolean)
(declare-const FALSE Boolean)
(declare-const NULL Boolean)
(assert (distinct TRUE FALSE)) ;I define the meaning of these constants
(assert (distinct TRUE NULL))
(assert (distinct FALSE NULL))
(assert (forall ((b Boolean))
(or (= b TRUE)
(= b FALSE)
(= b NULL))))
接下来,假设我>=
在此逻辑下定义整数运算符的语义,假设整数可以为 NULL。
(declare-const nullInt Int)
(declare-fun >=_B (Int Int) Boolean)
(assert (forall ((i1 Int) (i2 Int))
(= (= TRUE (>=_B i1 i2))
(and (distinct i1 nullInt)
(distinct i2 nullInt)
(>= i1 i2)))))
(assert (forall ((i1 Int) (i2 Int))
(= (= FALSE (>=_B i1 i2))
(and (distinct i1 nullInt)
(distinct i2 nullInt)
(not (>= i1 i2))))))
(assert (forall ((i Int))
(= NULL (>=_B i nullInt))))
(assert (forall ((i Int))
(= NULL (>=_B nullInt i))))
最后,通过上述定义,我>=_B
在断言中使用了该函数,但不断收到意外的 UNSAT 或未知。我想知道是什么让这个理论落入了不可判定的领域。是因为我做了布尔排序吗?还是因为我在 Int 的无限集上量化的断言?