小编Twe*_*wey的帖子

你将如何抽象出这对"类似形状"数据类型中的样板

一般问题

我有一对数据类型,它们是表示同一事物的两种不同方式,一种是在String中记录变量名,另一种是在Int中记录变量名.目前,它们都是定义的.但是,我想描述第一个表示,第二个表示将由某种关系生成.

具体例子

具体来说,第一个是STLC术语Universe的用户定义版本,而第二个是同一事物的de Bruijn索引版本:

{-# LANGUAGE RankNTypes, GADTs, DataKinds, TypeOperators, KindSignatures, PolyKinds, TypeFamilies, UndecidableInstances, FunctionalDependencies, FlexibleInstances  #-} 


-- * Universe of Terms * -- 

data Term :: Type -> * where 
    Var :: Id -> Term a
    Lam :: Id -> Type -> Term b -> Term (a :-> b)
    App :: Term (a :-> b) -> Term a -> Term b 

    Let :: Id -> Term a -> Term b -> Term b 
    Tup :: Term a -> …
Run Code Online (Sandbox Code Playgroud)

haskell types lambda-calculus gadt metacircular

6
推荐指数
1
解决办法
230
查看次数

为了终止检查,Agda是否会以不同方式处理记录和数据类型?

下面是一些定义游戏和游戏二进制操作的Agda(2.4.2)代码示例.

module MWE where

open import Data.Sum
open import Size

data Game (i : Size) : Set? where
  game : {Move : Set} ? {<i : Size< i} ? (play : Move ? Game <i) ? Game i

_?_ : ? {i j} ? Game i ? Game j ? Game ?
_?_ {i} {j} (game {Move/g} {<i} play/g) (game {Move/h} {<j} play/h)
  = game {?} {Move/g ? Move/h}
      ? { (inj? x) ? _?_ {<i} {j} (play/g x) (game …
Run Code Online (Sandbox Code Playgroud)

records termination agda

6
推荐指数
0
解决办法
135
查看次数