簡體   English   中英

smtlib 中的參數函數

[英]parametric functions in smtlib

我知道有一種方法可以在 SMTLIB 中聲明參數數據類型。 有沒有辦法定義一個接受這種類型的函數? 例如標准文檔有:

( declare - datatypes ( ( Pair 2) ) (
( par ( X Y ) ( ( pair ( first X ) ( second Y )) ))))

現在我如何聲明一個接受參數Pair類型的函數?

SMTLib不允許參數函數的定義。 請注意,內部函數,如 +、- 等,可以是多排序/參數化的,例如,它們可以很好地處理整數和實數。 但是用戶定義的函數不允許是多排序的。 也就是說,您可以編寫一個接受(Pair Int Bool)的函數,但不能編寫接受(Pair ab)的函數,其中ab是類型變量; 即多態。

這在https://smtlib.cs.uiowa.edu/papers/smt-lib-reference-v2.6-r2021-05-12.pdf 的第 4.1.5 節中有解釋:

使用排序或術語的命令所需的良好排序檢查始終針對當前簽名進行。 聲明或定義已在當前簽名中的符號是錯誤的。 這特別意味着,與理論函數符號相反,用戶定義的函數符號不能被重載。 (29)

后來在腳注 29 中,它說:

不重載用戶定義符號的動機是通過求解器簡化它們的處理。 此限制僅對於想要使用新的多態函數符號擴展腳本所使用的理論簽名的用戶有意義 - 即,如果它是理論符號,則其等級將包含參數排序。 例如,想要在任意列表上聲明“反向”函數的用戶,必須為腳本中使用的每個(具體)列表排序定義不同的反向函數符號。 此限制可能會在未來版本中刪除。

TLDR; 不,您不能在 SMTLib 中定義參數函數。 但隨着邏輯變得更豐富,這在未來可能會改變。 當前的解決方法是“單態化”過程,即在您使用的每個具體類型上生成函數的新版本。 這可以手動完成,也可以由為您生成 SMTLib 的更高級別工具自動完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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