谓词句使用 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 可能是建模目的的最佳选择。
我需要用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 可能是建模目的的最佳选择。