Programming with PCAs #
A (non-trivial) PCA is Turing-complete in the sense that it implements every partial computable function. We develop here basic programming constructs that witness this fact:
- the identity combinatory
I
- ordered pairs
pair
with projectionsfst
andsnd
- booleans
true
,false
and the conditional statementite
- fixed-point combinators
Z
andY
- Curry numerals
numeral n
withzero
, successorsucc
, predecessorpred
and primitive recursionprimrec
- TODO: general recursion (but it should be easy given what we have)
For any of the combinators so defined, say C
, we also prove two lemmas: df_C
characterizes totality of
expressions involving C
, and eq_C
gives the characteristic equation for C
. These lemmas are automatically
used by simp
.
Pairing #
Equations
- PCA.pair = PCA.compile (PCA.abstr `x (PCA.abstr `y (PCA.abstr `z (PCA.Expr.var `z ⬝ PCA.Expr.var `x ⬝ PCA.Expr.var `y))))
Instances For
Equations
- PCA.fst = PCA.compile (PCA.abstr `x (PCA.Expr.var `x ⬝ PCA.Expr.K))
Instances For
Equations
- PCA.fst.elm = PCA.Expr.elm (PCA.fst.get ⋯)
Instances For
Equations
- PCA.snd = PCA.compile (PCA.abstr `x (PCA.Expr.var `x ⬝ PCA.Expr.K'))
Instances For
Equations
- PCA.snd.elm = PCA.Expr.elm (PCA.snd.get ⋯)
Instances For
The fixed point combinator #
Equations
- PCA.X = PCA.compile (PCA.abstr `x (PCA.abstr `y (PCA.abstr `z (PCA.Expr.var `y ⬝ (PCA.Expr.var `x ⬝ PCA.Expr.var `x ⬝ PCA.Expr.var `y) ⬝ PCA.Expr.var `z))))
Instances For
Equations
- PCA.W = PCA.compile (PCA.abstr `x (PCA.abstr `y (PCA.Expr.var `y ⬝ (PCA.Expr.var `x ⬝ PCA.Expr.var `x ⬝ PCA.Expr.var `y))))
Instances For
Curry numerals #
Curry numeral
Equations
- PCA.numeral 0 = PCA.I
- PCA.numeral n.succ = PCA.pair ⬝ PCA.fal ⬝ PCA.numeral n
Instances For
@[simp]
Predecessor of a Curry numeral
Equations
- PCA.pred = PCA.compile (PCA.abstr `x (PCA.fst.elm ⬝ PCA.Expr.var `x ⬝ PCA.Expr.I ⬝ (PCA.snd.elm ⬝ PCA.Expr.var `x)))
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
def
PCA.primrec.eq_R
{A : Type u}
[PCA A]
(r u f m : Part A)
(hr : r ⇓ )
(hu : u ⇓ )
(hf : f ⇓ )
(hm : m ⇓ )
:
PCA.primrec.R ⬝ r ⬝ u ⬝ f ⬝ m = PCA.fst ⬝ m ⬝ (PCA.K ⬝ u) ⬝ PCA.compile
(PCA.abstr `y
(PCA.Expr.elm (f.get hf) ⬝ (PCA.pred.elm ⬝ PCA.Expr.elm (m.get hm)) ⬝ (PCA.Expr.elm (r.get hr) ⬝ PCA.Expr.elm (u.get hu) ⬝ PCA.Expr.elm (f.get hf) ⬝ (PCA.pred.elm ⬝ PCA.Expr.elm (m.get hm)) ⬝ (PCA.Expr.S ⬝ PCA.Expr.K ⬝ PCA.Expr.K))))
Equations
- ⋯ = ⋯
Instances For
Equations
- PCA.primrec.R.elm = PCA.Expr.elm (PCA.primrec.R.get ⋯)
Instances For
Primitive recursion
Equations
- PCA.primrec = PCA.compile (PCA.abstr `x (PCA.abstr `f (PCA.abstr `m (PCA.Z.elm ⬝ PCA.primrec.R.elm ⬝ PCA.Expr.var `x ⬝ PCA.Expr.var `f ⬝ PCA.Expr.var `m ⬝ PCA.Expr.I))))