一般问题
我有一对数据类型,它们是表示同一事物的两种不同方式,一种是在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) 下面是一些定义游戏和游戏二进制操作的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)