data Name params where
constr :: Type
constr :: Type
constr :: Type
...
(deriving Ind)?
Name ::= upperVar
constr ::= lowerVar
params ::= (var)*
Type ::= Type -> Type | ...
A proper subset of Haskell without explicit type declaration.
theorem proofName ([formulaName])? . formula
proof
[name = proof (: formula)? | [assumption] : formula ]
[name = proof (: formula)? | [assumption] : formula ]
[name = proof (: formula)? | [assumption] : formula ]
...
qed
name, proofName, assumption ::= lowerVar
proof ::= p
formula ::= F
tactic name params = [oneLine | multipleLine]
oneLine ::= q
multipleLine ::=
[name = proof (: formula)? | [assumption] : formula ]
[name = proof (: formula)? | [assumption] : formula ]
[name = proof (: formula)? | [assumption] : formula ]
e.g.
prog infixr 10 >>=
proof infixl 10 >>-
formula infixl 3 *
variable var ::= lowerVar | upperVar
formula F ::= upperVar | F -> F' | forall var . F | t :: S | S S' | S t
set/property S ::= upperVar | iota var . F | iota var . S | S S' | S t
program t ::= lowerVar | t t' | \ lowerVar . t
proof : p ::= lowerVar | mp p by p' | inst p by [S | F | t]
| ug var . p | cmp p | invcmp p from F
| simpCmp p | invSimp p from F | beta p
| invBeta p | discharge a (: F)? . p
| q [p | t | F | S ]
tactic q ::= lowerVar | \ lowerVar . p | \ lowerVar . q | q q | q [p | t | F | S ]