Kind/book/Kind.comparer.kind2
Victor Taelin 85ad65b026 use-notation
Now, there are two local binders:

let x = ...
use x = ...

The 'let' binder will create a local definition, type-check it, and
assign a name to it. When compiled, it will create 'dup' nodes.

The 'use' binder is just an alias. It will not bind a new variable, and,
when compiled, will create inline copies. Also, for type-checking, it
allows creating aliases that are definitionaly equal for the checker.
2024-03-08 17:39:37 -03:00

145 lines
4.4 KiB
Plaintext

Kind.comparer
: ∀(rec:
∀(a: Kind.Term) ∀(b: Kind.Term) ∀(dep: Nat) Bool
)
∀(a: Kind.Term)
∀(b: Kind.Term)
∀(dep: Nat)
Bool
= λrec λa λb λdep
use VAR = Kind.var
use SUC = Nat.succ
use a = (Kind.skip a)
use b = (Kind.skip b)
use R = ∀(b: Kind.Term) ∀(dep: Nat) Bool
use Y = λa.nam λa.ctx λb λdep Bool.true
use N = λa λb λdep
use R = ∀(dep: Nat) ∀(a: Kind.Term) Bool
use Y = λb.nam λb.ctx λdep λa Bool.true
use N = λb λdep λa
use P = λx ∀(b: Kind.Term) ∀(dep: Nat) Bool
use all = λa.nam λa.inp λa.bod λb λdep
use P = ∀(dep: Nat) Bool
use Y = λb.nam λb.inp λb.bod λdep
(Bool.and
(rec a.inp b.inp dep)
(rec
(a.bod (VAR a.nam dep))
(b.bod (VAR b.nam dep))
(SUC dep)
)
)
use N = λval λdep Bool.false
(Kind.if.all b P Y N dep)
use lam = λa.nam λa.bod λb λdep
use P = ∀(dep: Nat) Bool
use Y = λb.nam λb.bod λdep
(rec
(a.bod (VAR a.nam dep))
(b.bod (VAR b.nam dep))
(SUC dep)
)
use N = λval λdep Bool.false
(Kind.if.lam b P Y N dep)
use app = λa.fun λa.arg λb λdep
use P = ∀(dep: Nat) Bool
use Y = λb.fun λb.arg λdep
(Bool.and (rec a.fun b.fun dep) (rec a.arg b.arg dep))
use N = λval λdep Bool.false
(Kind.if.app b P Y N dep)
use ann = λa.val λa.typ λb λdep Bool.false
use slf = λa.nam λa.bod λb λdep
use P = ∀(dep: Nat) Bool
use Y = λb.nam λb.bod λdep
(rec
(a.bod (VAR a.nam dep))
(b.bod (VAR b.nam dep))
(SUC dep)
)
use N = λval λdep Bool.false
(Kind.if.slf b P Y N dep)
use ins = λa.val λb λdep Bool.false
use ref = λa.nam λa.val λb λdep
use P = ∀(dep: Nat) Bool
use Y = λb.nam λb.val λdep (String.equal a.nam b.nam)
use N = λval λdep Bool.false
(Kind.if.ref b P Y N dep)
use def = λa.nam λa.val λa.bod λb λdep Bool.false
use set = λb λdep
use P = ∀(dep: Nat) Bool
use Y = λdep Bool.true
use F = λval λdep Bool.false
(Kind.if.set b P Y F dep)
use u60 = λb λdep
use P = ∀(dep: Nat) Bool
use Y = λdep Bool.true
use N = λval λdep Bool.false
(Kind.if.u60 b P Y N dep)
use num = λa.val λb λdep
use P = ∀(dep: Nat) Bool
use Y = λb.val λdep (U60.equal a.val b.val)
use N = λval λdep Bool.false
(Kind.if.num b P Y N dep)
use op2 = λa.opr λa.fst λa.snd λb λdep
use P = ∀(dep: Nat) Bool
use Y = λb.opr λb.fst λb.snd λdep
(Bool.and (rec a.fst b.fst dep) (rec a.snd b.snd dep))
use N = λval λdep Bool.false
(Kind.if.op2 b P Y N dep)
use mat = λa.nam λa.x λa.z λa.s λa.p λb λdep
use P = ∀(dep: Nat) Bool
use Y = λb.nam λb.x λb.z λb.s λb.p λdep
(Bool.and
(rec a.x b.x dep)
(Bool.and
(rec a.z b.z dep)
(Bool.and
(rec
(a.s (VAR (String.concat a.nam "-1") dep))
(b.s (VAR (String.concat b.nam "-1") dep))
(SUC dep)
)
(rec
(a.p (VAR a.nam dep))
(b.p (VAR b.nam dep))
(SUC dep)
)
)
)
)
use N = λval λdep Bool.false
(Kind.if.mat b P Y N dep)
use txt = λa.txt λb λdep
use P = ∀(dep: Nat) Bool
use Y = λb.txt λdep (String.equal a.txt b.txt)
use N = λval λdep Bool.false
(Kind.if.txt b P Y N dep)
use hol = λa.nam λa.ctx λb λdep Bool.false
use var = λa.nam λa.idx λb λdep
use P = ∀(dep: Nat) Bool
use Y = λb.nam λb.idx λdep (Nat.equal a.idx b.idx)
use N = λval λdep Bool.false
(Kind.if.var b P Y N dep)
(~a
P
all
lam
app
ann
slf
ins
ref
def
set
u60
num
op2
mat
txt
hol
var
b
dep
)
(Kind.if.hol b R Y N dep a)
(Kind.if.hol a R Y N b dep)