谓词句使用 SMT2/Z3

Predicate sentence using SMT2/Z3

我需要用SMT2/Z3来写下面的句子,不知道有什么区别。

For every person who has a parent, he/she must love his/her parent.

到目前为止,我已经写了

(declare-const x Bool)
(declare-const y Bool)
(declare-const z Bool)
(declare-fun love () Bool)
      (assert =>
         ((forall (x) (y x) )
         (exists z)))

(check-sat)

但这只是给我一个我似乎无法修复的参数错误。

我的谓词是

Person(x) x is a person.

Parent(x, y) x is a parent of y.

Love(x, y) x loves y.

非常感谢任何帮助。

这是一种方法:

(declare-sort Person 0)
(declare-fun parentOf (Person Person) Bool)
(declare-fun loves    (Person Person) Bool)

(assert
   (forall ((x Person) (y Person))
       (=> (parentOf x y)
           (loves x y))))

(check-sat)
(get-model)

z3 说:

sat
(model
  ;; universe for Person:
  ;;   Person!val!0
  ;; -----------
  ;; definitions for universe elements:
  (declare-fun Person!val!0 () Person)
  ;; cardinality constraint:
  (forall ((x Person)) (= x Person!val!0))
  ;; -----------
  (define-fun loves ((x!0 Person) (x!1 Person)) Bool
    false)
  (define-fun parentOf ((x!0 Person) (x!1 Person)) Bool
    false)
)

本质上,z3 告诉我们我们的约束是可满足的(这就是输出 sat 的意思)和 a(注意:不是 ) 令人满意的分配是一个宇宙,其中有:

  • 正好一个人,名叫Person!val!0
  • 没有人爱任何人
  • 没有人是其他人的parent

这显然满足所有限制条件,但可能不是最有趣的模型。如果您断言更多事实,您可以获得更丰富的模型。 (例如,你可以说至少有 5 个人,没有人是他们自己的 parent,parenting 关系不对称,每个人都爱自己,等等,具体取决于你是什么尝试建模。)

请记住,SMT 求解器不适合处理量词。虽然像这样的陈述会很好地工作,但大量使用量词和 first-order 逻辑会将理论置于 semi-decidable 领域,即 z3 最终可能会说 unknown。 SMT 求解器最适合 quantifier-free 理论组合,例如算术、数组、数据类型等。对于此类问题,Prolog 可能是建模目的的最佳选择。