阿格达的“严格积极”

时间:2010-04-06 07:44:09

标签: haskell types interpreter semantics agda

我正在尝试根据我在Haskell中编写的程序将一些指称语义编码到Agda中。

data Value = FunVal (Value -> Value)
           | PriVal Int
           | ConVal Id [Value]
           | Error  String

在Agda中,直接翻译将是;

data Value : Set where
    FunVal : (Value -> Value) -> Value
    PriVal : ℕ -> Value
    ConVal : String -> List Value -> Value
    Error  : String -> Value

但是我得到了与FunVal有关的错误,因为;

  

价值并非严格正面,因为它出现在左边   箭头中的构造函数FunVal的类型定义   值。

这是什么意思?我可以用Agda编码吗?我是以错误的方式去做的吗?

感谢。

1 个答案:

答案 0 :(得分:34)

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 w w会再次给您apply w w。术语apply w w没有正常形式,这在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要求所有函数都是总计。 Here is an example由于@gallais使用共同偏好类型来完成此任务。