我的目標是定義一個內射函數f: Int -> Term
,其中Term
是一種新類型。我提到the definition的內射函數,我寫了以下內容:在Z3中定義內射函數
(declare-sort Term)
(declare-fun f (Int) Term)
(assert (forall ((x Int) (y Int))
(=> (= (f x) (f y)) (= x y))))
(check-sat)
這會導致超時。我懷疑這是因爲求解器試圖驗證Int
域中所有值的斷言,這是無限的。
我也檢查了上述模型適用於一些自定義排序,而不是Int
:
(declare-sort Term)
(declare-sort A)
(declare-fun f (A) Term)
(assert (forall ((x A) (y A))
(=> (= (f x) (f y)) (= x y))))
(declare-const x A)
(declare-const y A)
(assert (and (not (= x y)) (= (f x) (f y))))
(check-sat)
(get-model)
的第一個問題是如何實現相同的模型Int
排序,而不是A
。可以解決這個問題嗎?
我還在the tutorial的多模式部分找到了內射函數示例。我不明白爲什麼:pattern
註釋有幫助。所以第二個問題是爲什麼使用:pattern
,特別是對這個例子有什麼影響。
這不太對。 1)您在定義函數之前聲明常量,並且函數依賴於特定的常量值。正如你在第二個例子中看到的那樣,函數被定義爲'A'中的所有值。 2)你的情況下的函數'f'不是一個內射函數。從模型中可以看出。對於任何輸入'x!1',它將產生相同的答案'Term!val!0'。對於相同的參數,函數應該只產生相同的答案**。 –