使用SMT2/Z3的谓语句

使用SMT2/Z3的谓语句,z3,Z3,我需要用SMT2/Z3写下下面的句子,不确定区别 对于每一个有父母的人来说,他/她必须爱他的/她的父母 到目前为止,我已经写了 (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) 但这只是

我需要用SMT2/Z3写下下面的句子,不确定区别

对于每一个有父母的人来说,他/她必须爱他的/她的父母

到目前为止,我已经写了

(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是一个人

父(x,y)x是y的父

爱(x,y)x爱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(注意:不是)满足的分配是一个宇宙,其中有:

  • 正是一个人,名叫
    人!瓦尔!0
  • 没有人爱任何人
  • 没有人是别人的父母
这显然满足了所有约束条件,但可能不是最有趣的模型。如果你坚持进一步的事实,你可以得到更丰富的模型。(例如,你可以说至少有5个人,没有人是他们自己的父母,父母之间的关系不是对称的,每个人都爱自己,等等,这完全取决于你试图建立的模型。)


请记住,SMT解算器不适合处理量词。虽然像这样的陈述可以很好地工作,但大量使用量词和一阶逻辑将把理论置于半可判定的领域,即z3最终可以说
未知
。SMT解算器最适合于算术、数组、数据类型等理论的无量词组合。对于此类问题,Prolog可能是建模的最佳选择。

我想我们很快就要进入SAT了?不确定是否更好,但我现在只需要这方面的任何工作示例,所以这是完美的,非常感谢您的回答+建议!