簡體   English   中英

阿格達的“嚴格積極”

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

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