[英]Predicate sentence using SMT2/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)
但這只是給我一個我似乎無法解決的參數錯誤。
我的謂詞是
Person(x) x 是一個人。
Parent(x, y) x 是 y 的父級。
Love(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
)和(注:不是)滿足分配是一個宇宙,有:
Person!val!0
這顯然滿足所有約束,但可能不是最有趣的模型。 如果您斷言更多的事實,您可以獲得更豐富的模型。 (例如,您可以說至少有 5 個人,沒有人是自己的父母,養育關系不對稱,每個人都愛自己,等等,這取決於您要建模的對象。)
請記住,SMT 求解器不適合處理量詞。 雖然像這樣的語句會正常工作,但大量使用量詞和一階邏輯將使理論進入半可判定的領域,即 z3 最終可能會說unknown
。 SMT 求解器最適合無量詞的理論組合,例如算術、數組、數據類型等。對於此類問題,Prolog 可能是您建模的最佳選擇。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.