[英]“Strictly positive” in Agda
我正在嘗試根據我在Haskell中編寫的程序將一些指稱語義編碼到Agda中。
data Value = FunVal (Value -> Value)
| PriVal Int
| ConVal Id [Value]
| Error String
在阿格達,直接翻譯將是;
data Value : Set where
FunVal : (Value -> Value) -> Value
PriVal : ℕ -> Value
ConVal : String -> List Value -> Value
Error : String -> Value
但是我得到了與FunVal有關的錯誤,因為;
值並非嚴格為正,因為它出現在Value定義中構造函數FunVal類型中箭頭的左側。
這是什么意思? 我可以用Agda編碼嗎? 我是以錯誤的方式去做的嗎?
謝謝。
HOAS在Agda中不起作用,因為:
apply : Value -> Value -> Value
apply (FunVal f) x = f x
apply _ x = Error "Applying non-function"
w : Value
w = FunVal (\x -> apply x x)
現在,注意評估apply ww
讓你再次apply ww
。 apply ww
這個術語沒有正常形式,這在agda中是禁忌。 使用這個想法和類型:
data P : Set where
MkP : (P -> Set) -> P
我們可以得出一個矛盾。
解決這些悖論的方法之一只是允許嚴格正面的遞歸類型,這就是Agda和Coq選擇的方式。 這意味着,如果您聲明:
data X : Set where
MkX : F X -> X
F
必須是嚴格正的函子,這意味着X
可能永遠不會出現在任何箭頭的左側。 所以這些類型在X
中嚴格為正:
X * X
Nat -> X
X * (Nat -> X)
但這些不是:
X -> Bool
(X -> Nat) -> Nat -- this one is "positive", but not strictly
(X * Nat) -> X
簡而言之,您無法在Agda中表示您的數據類型。 您可以使用de Bruijn編碼來獲得可以使用的術語類型,但通常評估函數需要某種“超時”(通常稱為“燃料”),例如要評估的最大步驟數,因為Agda需要所有函數總計。 以下是 @gallais使用coinductive偏好類型來實現此目的的示例 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.