packages feed

CPL-0.0.5: samples/function.cpl

right object 1 with !
end object;

right object prod(a,b) with pair is
  pi1: prod -> a
  pi2: prod -> b
end object;

right object exp(a,b) with curry is
  eval: prod(exp,a) -> b
end object;

let uncurry(f) = eval . prod(f, I);

left object nat with pr is
  0: 1 -> nat
  s: nat -> nat
end object;

left object coprod(a,b) with case is
  in1: a -> coprod
  in2: b -> coprod
end object;

show pair(pi2,eval);

let add=eval.prod(pr(curry(pi2), curry(s.eval)), I);

simp add.pair(s.s.0, s.0);

let mult=eval.prod(pr(curry(0.!), curry(add.pair(eval, pi2))), I);

let primrec(f,g) = pi2.pr(pair(0,f), pair(s.pi1, g));
let fact = primrec(s.0, mult.prod(s,I));

simp fact.s.s.s.s.0;

left object list(p) with prl is
  nil: 1 -> list
  cons: prod(p,list) -> list
end object;

let append = eval.prod(prl(curry(pi2), curry(cons.pair(pi1.pi1, eval.pair(pi2.pi1, pi2)))), I);

let reverse=prl(nil, append.pair(pi2, cons.pair(pi1, nil.!)));

let hd = prl(in2, in1.pi1);

let hdp=case(hd,in2);

let tl = coprod(pi2,I).prl(in2, in1.prod(I, case(cons,nil)));

let tlp = case(tl, in2);

let seq = pi2.pr(pair(0,nil), pair(s.pi1, cons));

simp seq.s.s.s.0;

simp full seq.s.s.s.0;

simp hdp.tl.seq.s.s.s.0;

simp full append.pair(seq.s.s.0, seq.s.s.s.0);

simp full reverse.it;

right object inflist(a) with fold is
  head: inflist -> a
  tail: inflist -> inflist
end object;

let incseq=fold(I,s).0;

simp head.incseq;

simp head.tail.tail.tail.incseq;

let alt=fold(head.pi1, pair(pi2, tail.pi1));

let infseq=fold(I,I).0;

simp head.tail.tail.alt.pair(incseq, infseq);

#exit;