Nuprl uses tactics to automate parts of the proof development process. A tactic is a function that builds part of a proof; it is given a sequent, and it produces a proof whose goal is the sequent. The resulting proof might be incomplete (usually is), and it might not be possible to complete it if the approach is a dead end.
The general idea of tactic-oriented theorem proving was pioneered by Edinburgh LCF [25]. Nuprl has extended this method by introducing the concept of a tactic-tree and by introducing the concept of a transformation tactic. We will not discuss the later idea.
The idea of a tactic-tree is that a justification for a proof step can
be a tactic. The subproof built is not displayed, but the frontier of
the subproof is listed as the new subgoals to be proved. This makes
the tactic look like a new proof rule. So, by writing tactics, users
extend the logic, but in a totally
way. The tactics
actually build primitive proofs, so there is no increase in the
axiomatic basis of the theory. When a proof is complete, there is a
primitive proof built in the background.
Here is an example of the internal proof produced by a tactic called ChainThruHyps.
| 1. |
2. ![]() |
3. |
by ChainThruHyps
by Hyp
by Hyp
The rule used in chaining is
|
The more conventional form is
