namespace http://cds.omdoc.org/examples❚
theory Equality : ur:?PLF =
eq : {a: type} a ⟶ a ⟶ type ❘# 2 = 3 prec 0❘ role Eq❙
reflexive : {a,x:a} x = x ❘# refl %I1 %I2❙
❚
theory List : ur:?PLF =
include ?Equality❙
list : type ⟶ type❙
nil : {a} list a❘# nil 1❙
cons : {a} a ⟶ list a ⟶ list a❘# 2 %R, 3 prec 10❙
embed : {a} a ⟶ list a ❘= [a,x] x , (nil a)❘# 2 | prec 20❙
// the simplification rule generator does not allow fold to have implicit arguments yet❙
fold : {a,b:type} list a ⟶ b ⟶ (a ⟶ b ⟶ b) ⟶ b❙
fold_nil : {a:type,b,n:b,c: a ⟶ b ⟶ b} (fold a b (nil a) n c) = n❘ role Simplify❙
fold_cons : {a,b,x,l,n,c:a ⟶ b ⟶ b} (fold a b (x,l) n c) = (c x (fold a b l n c))❘role Simplify❙
concat : {a} list a ⟶ list a ⟶ list a❘= [a,l,m] fold a (list a) l m [x,xs] x,xs ❘# 2 + 3 prec 5❙
❚
theory Test : ur:?PLF =
include ?List❙
a : type❙
c : a❙
f : a ⟶ a❙
test : (c,c|)+(c,c|) = c,c,c,c|❘= refl❙
❚