使用SMT2/Z3的谓语句
我需要用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) 但这只是
(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
- 没有人爱任何人
- 没有人是别人的父母
请记住,SMT解算器不适合处理量词。虽然像这样的陈述可以很好地工作,但大量使用量词和一阶逻辑将把理论置于半可判定的领域,即z3最终可以说
未知
。SMT解算器最适合于算术、数组、数据类型等理论的无量词组合。对于此类问题,Prolog可能是建模的最佳选择。我想我们很快就要进入SAT了?不确定是否更好,但我现在只需要这方面的任何工作示例,所以这是完美的,非常感谢您的回答+建议!