簡體   English   中英

使用 SMT2/Z3 的謂詞句

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM