on master help sign in
Merge pull request #4687 from martinbaker/myDoc
3befe35Jan de Muijnck-Hughes
docs/image/plusReducesProof.pngnew file

Binary file not shown.

docs/image/plusReducesProof.svgnew file+339
@@ -0,0 +1,339 @@
1+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2+<!-- Created with Inkscape (http://www.inkscape.org/) -->
3+
4+<svg
5+ xmlns:dc="http://purl.org/dc/elements/1.1/"
6+ xmlns:cc="http://creativecommons.org/ns#"
7+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8+ xmlns:svg="http://www.w3.org/2000/svg"
9+ xmlns="http://www.w3.org/2000/svg"
10+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12+ width="210mm"
13+ height="297mm"
14+ viewBox="0 0 744.09448819 1052.3622047"
15+ id="svg2"
16+ version="1.1"
17+ inkscape:version="0.91 r13725"
18+ sodipodi:docname="plusReducesProof.svg">
19+ <defs
20+ id="defs4">
21+ <marker
22+ inkscape:stockid="Arrow1Mend"
23+ orient="auto"
24+ refY="0.0"
25+ refX="0.0"
26+ id="marker6540"
27+ style="overflow:visible;"
28+ inkscape:isstock="true">
29+ <path
30+ id="path6542"
31+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
32+ style="fill-rule:evenodd;stroke:#0000ff;stroke-width:1pt;stroke-opacity:1;fill:#0000ff;fill-opacity:1"
33+ transform="scale(0.4) rotate(180) translate(10,0)" />
34+ </marker>
35+ <marker
36+ inkscape:stockid="Arrow1Mend"
37+ orient="auto"
38+ refY="0.0"
39+ refX="0.0"
40+ id="marker5748"
41+ style="overflow:visible;"
42+ inkscape:isstock="true">
43+ <path
44+ id="path5750"
45+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
46+ style="fill-rule:evenodd;stroke:#0000ff;stroke-width:1pt;stroke-opacity:1;fill:#0000ff;fill-opacity:1"
47+ transform="scale(0.4) rotate(180) translate(10,0)" />
48+ </marker>
49+ <marker
50+ inkscape:isstock="true"
51+ style="overflow:visible;"
52+ id="marker5154"
53+ refX="0.0"
54+ refY="0.0"
55+ orient="auto"
56+ inkscape:stockid="Arrow1Mend"
57+ inkscape:collect="always">
58+ <path
59+ transform="scale(0.4) rotate(180) translate(10,0)"
60+ style="fill-rule:evenodd;stroke:#0000ff;stroke-width:1pt;stroke-opacity:1;fill:#0000ff;fill-opacity:1"
61+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
62+ id="path5156" />
63+ </marker>
64+ <marker
65+ inkscape:stockid="Arrow1Mend"
66+ orient="auto"
67+ refY="0.0"
68+ refX="0.0"
69+ id="Arrow1Mend"
70+ style="overflow:visible;"
71+ inkscape:isstock="true"
72+ inkscape:collect="always">
73+ <path
74+ id="path4189"
75+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
76+ style="fill-rule:evenodd;stroke:#0000ff;stroke-width:1pt;stroke-opacity:1;fill:#0000ff;fill-opacity:1"
77+ transform="scale(0.4) rotate(180) translate(10,0)" />
78+ </marker>
79+ </defs>
80+ <sodipodi:namedview
81+ id="base"
82+ pagecolor="#ffffff"
83+ bordercolor="#666666"
84+ borderopacity="1.0"
85+ inkscape:pageopacity="0.0"
86+ inkscape:pageshadow="2"
87+ inkscape:zoom="1"
88+ inkscape:cx="397.18872"
89+ inkscape:cy="520"
90+ inkscape:document-units="px"
91+ inkscape:current-layer="layer1"
92+ showgrid="false"
93+ inkscape:window-width="1110"
94+ inkscape:window-height="1011"
95+ inkscape:window-x="-4"
96+ inkscape:window-y="0"
97+ inkscape:window-maximized="0" />
98+ <metadata
99+ id="metadata7">
100+ <rdf:RDF>
101+ <cc:Work
102+ rdf:about="">
103+ <dc:format>image/svg+xml</dc:format>
104+ <dc:type
105+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
106+ <dc:title></dc:title>
107+ </cc:Work>
108+ </rdf:RDF>
109+ </metadata>
110+ <g
111+ inkscape:label="Layer 1"
112+ inkscape:groupmode="layer"
113+ id="layer1">
114+ <text
115+ xml:space="preserve"
116+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
117+ x="266"
118+ y="225.36221"
119+ id="text4136"
120+ sodipodi:linespacing="125%"><tspan
121+ sodipodi:role="line"
122+ id="tspan4138"
123+ x="266"
124+ y="225.36221">assumptions</tspan><tspan
125+ sodipodi:role="line"
126+ x="266"
127+ y="250.36221"
128+ id="tspan4140">(context)</tspan></text>
129+ <text
130+ sodipodi:linespacing="125%"
131+ id="text4142"
132+ y="238.36221"
133+ x="526"
134+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;"
135+ xml:space="preserve"><tspan
136+ id="tspan4146"
137+ y="238.36221"
138+ x="526"
139+ sodipodi:role="line">goal</tspan></text>
140+ <text
141+ xml:space="preserve"
142+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.5px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
143+ x="420"
144+ y="289.36221"
145+ id="text4150"
146+ sodipodi:linespacing="125%"><tspan
147+ sodipodi:role="line"
148+ x="420"
149+ y="289.36221"
150+ id="tspan4152">(k : Nat) -&gt; (k = plus k 0) -&gt; S k = S (plus k 0)</tspan></text>
151+ <path
152+ style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
153+ d="m 241,262.3622 428,-1"
154+ id="path4154"
155+ inkscape:connector-curvature="0" />
156+ <path
157+ inkscape:connector-curvature="0"
158+ id="path4160"
159+ d="m 241,308.3622 428,-1"
160+ style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
161+ <text
162+ sodipodi:linespacing="125%"
163+ id="text4162"
164+ y="312.36221"
165+ x="175"
166+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.5px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;"
167+ xml:space="preserve"><tspan
168+ id="tspan4164"
169+ y="312.36221"
170+ x="175"
171+ sodipodi:role="line">intro `{{k}}</tspan></text>
172+ <text
173+ sodipodi:linespacing="125%"
174+ id="text4166"
175+ y="333.36221"
176+ x="482"
177+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.5px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
178+ xml:space="preserve"><tspan
179+ id="tspan4168"
180+ y="333.36221"
181+ x="482"
182+ sodipodi:role="line">(k = plus k 0) -&gt; S k = S (plus k 0)</tspan></text>
183+ <text
184+ xml:space="preserve"
185+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.5px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
186+ x="324"
187+ y="334.36221"
188+ id="text4170"
189+ sodipodi:linespacing="125%"><tspan
190+ sodipodi:role="line"
191+ x="324"
192+ y="334.36221"
193+ id="tspan4172">k : Nat</tspan></text>
194+ <path
195+ style="fill:none;fill-rule:evenodd;stroke:#0000ff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
196+ d="m 441,294.3622 -73,30"
197+ id="path4174"
198+ inkscape:connector-curvature="0"
199+ sodipodi:nodetypes="cc" />
200+ <path
201+ style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
202+ d="m 241,352.3622 428,-1"
203+ id="path5134"
204+ inkscape:connector-curvature="0" />
205+ <text
206+ xml:space="preserve"
207+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.5px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
208+ x="171"
209+ y="355.36221"
210+ id="text5136"
211+ sodipodi:linespacing="125%"><tspan
212+ sodipodi:role="line"
213+ x="171"
214+ y="355.36221"
215+ id="tspan5138">intro `{{ih}}</tspan></text>
216+ <text
217+ xml:space="preserve"
218+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.5px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
219+ x="570"
220+ y="372.36221"
221+ id="text5140"
222+ sodipodi:linespacing="125%"><tspan
223+ sodipodi:role="line"
224+ x="570"
225+ y="372.36221"
226+ id="tspan5142">S k = S (plus k 0)</tspan></text>
227+ <text
228+ sodipodi:linespacing="125%"
229+ id="text5144"
230+ y="378.36221"
231+ x="324"
232+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.5px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
233+ xml:space="preserve"><tspan
234+ id="tspan5146"
235+ y="378.36221"
236+ x="324"
237+ sodipodi:role="line">k : Nat</tspan></text>
238+ <text
239+ sodipodi:linespacing="125%"
240+ id="text5150"
241+ y="393.36221"
242+ x="323"
243+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.5px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
244+ xml:space="preserve"><tspan
245+ id="tspan5152"
246+ y="393.36221"
247+ x="323"
248+ sodipodi:role="line">ih : k = plus k 0</tspan></text>
249+ <path
250+ inkscape:connector-curvature="0"
251+ id="path5728"
252+ d="m 242,404.3622 428,-1"
253+ style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
254+ <text
255+ sodipodi:linespacing="125%"
256+ id="text5730"
257+ y="408.36221"
258+ x="109"
259+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.5px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
260+ xml:space="preserve"><tspan
261+ id="tspan5732"
262+ y="408.36221"
263+ x="109"
264+ sodipodi:role="line">rewriteWith (Var `{{ih}})</tspan></text>
265+ <text
266+ sodipodi:linespacing="125%"
267+ id="text5734"
268+ y="424.36221"
269+ x="587"
270+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.5px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
271+ xml:space="preserve"><tspan
272+ id="tspan5736"
273+ y="424.36221"
274+ x="587"
275+ sodipodi:role="line">S k = S k </tspan></text>
276+ <text
277+ xml:space="preserve"
278+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.5px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
279+ x="325"
280+ y="430.36221"
281+ id="text5738"
282+ sodipodi:linespacing="125%"><tspan
283+ sodipodi:role="line"
284+ x="325"
285+ y="430.36221"
286+ id="tspan5740">k : Nat</tspan></text>
287+ <path
288+ style="fill:none;fill-rule:evenodd;stroke:#0000ff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker5748)"
289+ d="m 610,379.3622 1,29"
290+ id="path5742"
291+ inkscape:connector-curvature="0"
292+ sodipodi:nodetypes="cc" />
293+ <text
294+ xml:space="preserve"
295+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.5px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
296+ x="324"
297+ y="445.36221"
298+ id="text5744"
299+ sodipodi:linespacing="125%"><tspan
300+ sodipodi:role="line"
301+ x="324"
302+ y="445.36221"
303+ id="tspan5746">ih : k = plus k 0</tspan></text>
304+ <path
305+ inkscape:connector-curvature="0"
306+ id="path7294"
307+ d="m 418,460.3622 -2,-199"
308+ style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
309+ sodipodi:nodetypes="cc" />
310+ <path
311+ sodipodi:nodetypes="cc"
312+ inkscape:connector-curvature="0"
313+ id="path5148"
314+ d="m 519,339.3622 -107,44"
315+ style="fill:none;fill-rule:evenodd;stroke:#0000ff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker5154)" />
316+ <path
317+ style="fill:none;fill-rule:evenodd;stroke:#0000ff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:12, 2;stroke-dashoffset:0;stroke-opacity:1"
318+ d="m 609,391.3622 -197,49"
319+ id="path6538"
320+ inkscape:connector-curvature="0"
321+ sodipodi:nodetypes="cc" />
322+ <path
323+ style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
324+ d="m 242,458.3622 428,-1"
325+ id="path7308"
326+ inkscape:connector-curvature="0" />
327+ <text
328+ xml:space="preserve"
329+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.5px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
330+ x="177"
331+ y="462.36221"
332+ id="text7310"
333+ sodipodi:linespacing="125%"><tspan
334+ sodipodi:role="line"
335+ x="177"
336+ y="462.36221"
337+ id="tspan7312">reflexivity</tspan></text>
338+ </g>
339+</svg>
docs/proofs/index.rst+1
@@ -24,4 +24,5 @@ A tutorial on theorem proving in Idris.
24 patterns
24 patterns
25 propositional
25 propositional
26 interactive
26 interactive
27+ interactiveOld
27
28
docs/proofs/interactive.rst+177−101
@@ -1,15 +1,102 @@
1−***************************************
1+***************************
2−DEPRECATED: Interactive Theorem Proving
2+Interactive Theorem Proving
3−***************************************
3+***************************
4
4
5−.. warning::
6− The interactive theorem-proving interface documented here has been
5+Idris supports interactive theorem proving via elaborator reflection.
7− deprecated in favor of :ref:`elaborator-reflection`.
8
6
9−Idris also supports interactive theorem proving via tactics. This
7+:ref:'elaborator-reflection' is also used to convert high-level Idris code into
10−is generally not recommended to be used directly, but rather used as a
8+the core language and for customising the language. Here we show how to use it
11−mechanism for building proof automation which is beyond the scope of this
9+to interactively construct proofs.
12−tutorial. In this section, we briefly discus tactics.
10+
11+The primary purpose of the elaboration mechanism is to elaborate Idris and so it
12+is not optimised to work as a proof assistant, however it can interactively
13+construct proofs as described on this page.
14+
15+Elab and Pruviloj Libraries
16+===========================
17+
18+Elaborator reflection is defined in prelude/Language/Reflection/Elab.idr
19+and pruviloj is defined in Idris-dev/libs/pruviloj/
20+
21+``Elab`` defines the basics such as: solve, attack, intro, compute,
22+rewriteWith and others.
23+``pruviloj`` defines some more advanced derived commands such as:
24+reflexivity and others.
25+
26+To use ``pruviloj`` call Idris with the "-p pruviloj" option and add:
27+
28+.. code-block:: idris
29+
30+ import Pruviloj
31+ import Pruviloj.Induction
32+
33+to the top of your file.
34+
35+It is useful to get the docs at the REPL by using the ``:doc`` command, and
36+search the docstrings using ``:apropos``. So to introduce the functions from
37+Elab and Pruviloj, that we will need for the following example, here are
38+their docstrings:
39+
40+.. code-block:: idris
41+
42+ *plusReducesZ> :doc solve
43+ Language.Reflection.Elab.Tactics.solve : Elab ()
44+ Substitute a guess into a hole.
45+
46+.. code-block:: idris
47+
48+ *plusReducesZ> :doc attack
49+ Language.Reflection.Elab.Tactics.attack : Elab ()
50+ Convert a hole to make it suitable for bindings - that is, transform
51+ it such that it has the form ?h : t . h as opposed to ?h : t . f h.
52+
53+ The binding tactics require that a hole be directly under its binding,
54+ or else the scopes of the generated terms won't make sense. This
55+ tactic creates a new hole of the proper form, and points the old hole
56+ at it.
57+
58+.. code-block:: idris
59+
60+ *plusReducesZ> :doc intro
61+ Language.Reflection.Elab.Tactics.intro : (n : TTName) -> Elab ()
62+ Introduce a lambda binding around the current hole and focus on the
63+ body. Requires that the hole be in binding form (use attack).
64+ Arguments:
65+ n : TTName -- the name to use for the argument
66+
67+.. code-block:: idris
68+
69+ *plusReducesZ> :doc compute
70+ Language.Reflection.Elab.Tactics.compute : Elab ()
71+ Normalise the goal.
72+
73+.. code-block:: idris
74+
75+ *plusReducesZ> :doc rewriteWith
76+ Language.Reflection.Elab.Tactics.rewriteWith : Raw -> Elab ()
77+ Attempt to rewrite the goal using an equality.
78+
79+ The tactic searches the goal for applicable subterms, and constructs a
80+ context for replace using them. In some cases, this is not possible,
81+ and replace must be called manually with an appropriate context.
82+
83+ Because this tactic internally introduces a let binding, it requires
84+ that the hole be immediately under its binder (use attack if it might
85+ not be).
86+
87+Here is the command from pruviloj that we will need for the example on
88+this page:
89+
90+.. code-block:: idris
91+
92+ *plusReducesZ> :doc reflexivity
93+ Pruviloj.Core.reflexivity : Elab ()
94+ A special-purpose tactic that attempts to solve a goal using Refl.
95+ This is useful for ensuring that goals in fact are trivial when
96+ developing or testing other tactics; otherwise, consider using search.
97+
98+Interactive Example: plusReduces
99+================================
13
100
14One way to write proofs interactively is to write the general *structure* of
101One way to write proofs interactively is to write the general *structure* of
15the proof, and use the interactive mode to complete the details.
102the proof, and use the interactive mode to complete the details.
@@ -25,145 +112,134 @@ hypothesis, and insert *holes* for the rest of the definition:
25
112
26.. code-block:: idris
113.. code-block:: idris
27
114
115+ import Pruviloj
116+ import Pruviloj.Induction
117+
28 plusReducesZ' : (n:Nat) -> n = plus n Z
118 plusReducesZ' : (n:Nat) -> n = plus n Z
29 plusReducesZ' Z = ?plusredZ_Z
119 plusReducesZ' Z = ?plusredZ_Z
30 plusReducesZ' (S k) = let ih = plusReducesZ' k in
120 plusReducesZ' (S k) = let ih = plusReducesZ' k in
31 ?plusredZ_S
121 ?plusredZ_S
32
122
33On running , two global names are created, ``plusredZ_Z`` and
123On running , two global names are created, ``plusredZ_Z`` and
34−``plusredZ_S``, with no definition. We can use the ``:m`` command at the
124+``plusredZ_S``, with no definition.
35−prompt to find out which holes are still to be solved (or, more
36−precisely, which functions exist but have no definitions), then the
37−``:t`` command to see their types:
38
125
39.. code-block:: idris
126.. code-block:: idris
40
127
41− *theorems> :m
128+ *theorems> : idris plusReducesZ.idr -p pruviloj
42− Global holes:
43− [plusredZ_S,plusredZ_Z]
44
129
45−.. code-block:: idris
130+ . / _/___/ /____(_)____
131+ / // __ / ___/ / ___/ Version 1.2.0
132+ _/ // /_/ / / / (__ ) http://www.idris-lang.org/
133+ /___/\__,_/_/ /_/____/ Type :? for help
46
134
47− *theorems> :t plusredZ_Z
135+ Idris is free software with ABSOLUTELY NO WARRANTY.
48− plusredZ_Z : Z = plus Z Z
136+ For details type :warranty.
137+ Holes: Main.plusredZ_S, Main.plusredZ_Z
49
138
50− *theorems> :t plusredZ_S
139+This tells us that we have two holes Main.plusredZ_S and Main.plusredZ_Z. We can solve
51− plusredZ_S : (k : Nat) -> (k = plus k Z) -> S k = plus (S k) Z
140+these separately, ``plusredZ_Z`` is the simplest so we will do that first.
52
141
53−The ``:p`` command enters interactive proof mode, which can be used to
142+The ``:elab plusredZ_Z`` command enters interactive elaboration mode, which can be used to
54−complete the missing definitions.
143+complete the missing definition for plusredZ_Z.
55
144
56.. code-block:: idris
145.. code-block:: idris
57
146
58− *theorems> :p plusredZ_Z
147+ *plusReducesZ> :elab plusredZ_Z
59
148
60− ---------------------------------- (plusredZ_Z) --------
149+ ---------- Goal: ----------
61− {hole0} : Z = plus Z Z
150+ {hole_0} : 0 = 0
62
151
63−This gives us a list of premises (above the line; there are none here)
152+This has been normalised to ``0 = 0`` so now we have to prove that ``0`` equals ``0``, which
64−and the current goal (below the line; named ``{hole0}`` here). At the
153+is easy to prove by reflexivity from the pruviloj library:
65−prompt we can enter tactics to direct the construction of the proof. In
66−this case, we can normalise the goal with the ``compute`` tactic:
67
154
68.. code-block:: idris
155.. code-block:: idris
156+ -Main.plusredZ_Z> reflexivity
157+ plusredZ_Z: No more goals.
69
158
70− -plusredZ_Z> compute
159+This tells us that the proof is complete. We can now leave the interactive mode which
71−
160+we entered with the ``:elab`` command. We do this with the ``:qed`` command:
72− ---------------------------------- (plusredZ_Z) --------
73− {hole0} : Z = Z
74−
75−Now we have to prove that ``Z`` equals ``Z``, which is easy to prove by
76−``Refl``. To apply a function, such as ``Refl``, we use ``refine`` which
77−introduces subgoals for each of the function’s explicit arguments
78−(``Refl`` has none):
79
161
80.. code-block:: idris
162.. code-block:: idris
81
163
82− -plusredZ_Z> refine Refl
164+ -Main.plusredZ_Z> :qed
83− plusredZ_Z: no more goals
165+ Proof completed!
84−
166+ Main.plusredZ_Z = %runElab (do reflexivity)
85−Here, we could also have used the ``trivial`` tactic, which tries to
167+ Holes: Main.plusredZ_S
86−refine by ``Refl``, and if that fails, tries to refine by each name in
87−the local context. When a proof is complete, we use the ``qed`` tactic
88−to add the proof to the global context, and remove the hole from the
89−unsolved holes list. This also outputs a trace of the proof:
90
168
91−.. code-block:: idris
169+This gives us a trace of the proof which is ``plusredZ_Z = %runElab (do reflexivity)``. We
92−
170+can cut & paste this into the hole in the original file. This also tells us that we
93− -plusredZ_Z> qed
171+have another hole ``Main.plusredZ_S`` remaining.
94− plusredZ_Z = proof
95− compute
96− refine Refl
97
172
98−.. code-block:: idris
173+This remaining proof is bit more complicated, the following diagram gives an overview:
99
174
100− *theorems> :m
175+|image|
101− Global holes:
102− [plusredZ_S]
103
176
104−The ``:addproof`` command, at the interactive prompt, will add the proof
177+We approach this remaining proof in the same way by using the ``:elab`` command:
105−to the source file (effectively in an appendix). Let us now prove the
106−other required lemma, ``plusredZ_S``:
107
178
108.. code-block:: idris
179.. code-block:: idris
109
180
110− *theorems> :p plusredZ_S
181+ *plusReducesZ> :elab plusredZ_S
111
182
112− ---------------------------------- (plusredZ_S) --------
183+
184+ ---------- Goal: ----------
113− {hole0} : (k : Nat) -> (k = plus k Z) -> S k = plus (S k) Z
185+ {hole_0} : (k : Nat) -> (k = plus k 0) -> S k = S (plus k 0)
114
186
115In this case, the goal is a function type, using ``k`` (the argument
187In this case, the goal is a function type, using ``k`` (the argument
116accessible by pattern matching) and ``ih`` — the local variable
188accessible by pattern matching) and ``ih`` — the local variable
117containing the result of the recursive call. We can introduce these as
189containing the result of the recursive call. We can introduce these as
118−premises using the ``intro`` tactic twice (or ``intros``, which
190+assumptions using the ``intro`` tactic twice. The parameter is entered as
119−introduces all arguments as premises). This gives:
191+a constant of type ``TTName`` which is entered as a backtick with double
192+braces `{{ih}}. This gives:
120
193
121.. code-block:: idris
194.. code-block:: idris
122
195
123− k : Nat
196+ -Main.plusredZ_S> intro `{{k}}
124− ih : k = plus k Z
125− ---------------------------------- (plusredZ_S) --------
126− {hole2} : S k = plus (S k) Z
127−
128−Since plus is defined by recursion on its first argument, the term
129−``plus (S k) Z`` in the goal can be simplified, so we use ``compute``.
130
197
131−.. code-block:: idris
198+ ---------- Assumptions: ----------
199+ k : Nat
200+ ---------- Goal: ----------
201+ {hole_0} : (k = plus k 0) -> S k = S (plus k 0)
202+ -Main.plusredZ_S> intro `{{ih}}
132
203
204+ ---------- Assumptions: ----------
133− k : Nat
205+ k : Nat
134− ih : k = plus k Z
206+ ih : k = plus k 0
135− ---------------------------------- (plusredZ_S) --------
207+ ---------- Goal: ----------
136− {hole2} : S k = S (plus k Z)
208+ {hole_0} : S k = S (plus k 0)
137
209
138−We know, from the type of ``ih``, that ``k = plus k Z``, so we would
210+We know, from the type of ``ih``, that ``k = plus k 0``, so we would
139−like to use this knowledge to replace ``plus k Z`` in the goal with
211+like to use this knowledge to replace ``plus k 0`` in the goal with
140−``k``. We can achieve this with the ``rewrite`` tactic:
212+``k``. We can achieve this with the ``rewriteWith`` tactic:
141
213
142.. code-block:: idris
214.. code-block:: idris
143
215
144− -plusredZ_S> rewrite ih
216+ -Main.plusredZ_S> rewriteWith (Var `{{ih}})
145
217
218+ ---------- Assumptions: ----------
146− k : Nat
219+ k : Nat
147− ih : k = plus k Z
220+ ih : k = plus k 0
148− ---------------------------------- (plusredZ_S) --------
221+ ---------- Goal: ----------
149− {hole3} : S k = S k
222+ {hole_0} : S k = S k
150
223
151− -plusredZ_S>
152−
153−The ``rewrite`` tactic takes an equality proof as an argument, and tries
224+The ``rewriteWith`` tactic takes an equality proof as an argument, and tries
154−to rewrite the goal using that proof. Here, it results in an equality
225+to rewrite the goal using that proof. The ih value is entered as a constant
226+of type ``TTName`` which is entered as a backtick with double braces `{{ih}} but
227+``rewriteWith`` requires an expression of type ``Raw``, rather than just a name,
228+so the Var constructor is used to make a variable. Here, it results in an equality
155−which is trivially provable:
229+which is trivially provable using reflexivity:
156
230
157.. code-block:: idris
231.. code-block:: idris
158
232
159− -plusredZ_S> trivial
233+ -Main.plusredZ_S> reflexivity
160− plusredZ_S: no more goals
234+ plusredZ_S: No more goals.
161− -plusredZ_S> qed
235+ -Main.plusredZ_S> :qed
236+ Proof completed!
162− plusredZ_S = proof {
237+ Main.plusredZ_S = %runElab (do intro `{{k}}
163− intros;
238+ intro `{{ih}}
164− rewrite ih;
239+ compute
165− trivial;
240+ rewriteWith (Var `{{ih}})
166− }
241+ reflexivity)
242+
243+Again, we can cut & paste this into the hole in the original file.
167
244
168−Again, we can add this proof to the end of our source file using the
245+.. |image| image:: ../image/plusReducesProof.png
169−``:addproof`` command at the interactive prompt.
docs/proofs/interactiveOld.rstnew file+169
@@ -0,0 +1,169 @@
1+**************************************************************
2+DEPRECATED: Interactive Theorem Proving Using Old Tactics Code
3+**************************************************************
4+
5+.. warning::
6+ The interactive theorem-proving interface documented here has been
7+ deprecated in favor of :ref:`elaborator-reflection`.
8+
9+Idris also supports interactive theorem proving via tactics. This
10+is generally not recommended to be used directly, but rather used as a
11+mechanism for building proof automation which is beyond the scope of this
12+tutorial. In this section, we briefly discus tactics.
13+
14+One way to write proofs interactively is to write the general *structure* of
15+the proof, and use the interactive mode to complete the details.
16+Consider the following definition, proved in :ref:`sect-theorems`:
17+
18+.. code-block:: idris
19+
20+ plusReduces : (n:Nat) -> plus Z n = n
21+
22+We’ll be constructing the proof by *induction*, so we write the cases for ``Z``
23+and ``S``, with a recursive call in the ``S`` case giving the inductive
24+hypothesis, and insert *holes* for the rest of the definition:
25+
26+.. code-block:: idris
27+
28+ plusReducesZ' : (n:Nat) -> n = plus n Z
29+ plusReducesZ' Z = ?plusredZ_Z
30+ plusReducesZ' (S k) = let ih = plusReducesZ' k in
31+ ?plusredZ_S
32+
33+On running , two global names are created, ``plusredZ_Z`` and
34+``plusredZ_S``, with no definition. We can use the ``:m`` command at the
35+prompt to find out which holes are still to be solved (or, more
36+precisely, which functions exist but have no definitions), then the
37+``:t`` command to see their types:
38+
39+.. code-block:: idris
40+
41+ *theorems> :m
42+ Global holes:
43+ [plusredZ_S,plusredZ_Z]
44+
45+.. code-block:: idris
46+
47+ *theorems> :t plusredZ_Z
48+ plusredZ_Z : Z = plus Z Z
49+
50+ *theorems> :t plusredZ_S
51+ plusredZ_S : (k : Nat) -> (k = plus k Z) -> S k = plus (S k) Z
52+
53+The ``:p`` command enters interactive proof mode, which can be used to
54+complete the missing definitions.
55+
56+.. code-block:: idris
57+
58+ *theorems> :p plusredZ_Z
59+
60+ ---------------------------------- (plusredZ_Z) --------
61+ {hole0} : Z = plus Z Z
62+
63+This gives us a list of premises (above the line; there are none here)
64+and the current goal (below the line; named ``{hole0}`` here). At the
65+prompt we can enter tactics to direct the construction of the proof. In
66+this case, we can normalise the goal with the ``compute`` tactic:
67+
68+.. code-block:: idris
69+
70+ -plusredZ_Z> compute
71+
72+ ---------------------------------- (plusredZ_Z) --------
73+ {hole0} : Z = Z
74+
75+Now we have to prove that ``Z`` equals ``Z``, which is easy to prove by
76+``Refl``. To apply a function, such as ``Refl``, we use ``refine`` which
77+introduces subgoals for each of the function’s explicit arguments
78+(``Refl`` has none):
79+
80+.. code-block:: idris
81+
82+ -plusredZ_Z> refine Refl
83+ plusredZ_Z: no more goals
84+
85+Here, we could also have used the ``trivial`` tactic, which tries to
86+refine by ``Refl``, and if that fails, tries to refine by each name in
87+the local context. When a proof is complete, we use the ``qed`` tactic
88+to add the proof to the global context, and remove the hole from the
89+unsolved holes list. This also outputs a trace of the proof:
90+
91+.. code-block:: idris
92+
93+ -plusredZ_Z> qed
94+ plusredZ_Z = proof
95+ compute
96+ refine Refl
97+
98+.. code-block:: idris
99+
100+ *theorems> :m
101+ Global holes:
102+ [plusredZ_S]
103+
104+The ``:addproof`` command, at the interactive prompt, will add the proof
105+to the source file (effectively in an appendix). Let us now prove the
106+other required lemma, ``plusredZ_S``:
107+
108+.. code-block:: idris
109+
110+ *theorems> :p plusredZ_S
111+
112+ ---------------------------------- (plusredZ_S) --------
113+ {hole0} : (k : Nat) -> (k = plus k Z) -> S k = plus (S k) Z
114+
115+In this case, the goal is a function type, using ``k`` (the argument
116+accessible by pattern matching) and ``ih`` — the local variable
117+containing the result of the recursive call. We can introduce these as
118+premises using the ``intro`` tactic twice (or ``intros``, which
119+introduces all arguments as premises). This gives:
120+
121+.. code-block:: idris
122+
123+ k : Nat
124+ ih : k = plus k Z
125+ ---------------------------------- (plusredZ_S) --------
126+ {hole2} : S k = plus (S k) Z
127+
128+Since plus is defined by recursion on its first argument, the term
129+``plus (S k) Z`` in the goal can be simplified, so we use ``compute``.
130+
131+.. code-block:: idris
132+
133+ k : Nat
134+ ih : k = plus k Z
135+ ---------------------------------- (plusredZ_S) --------
136+ {hole2} : S k = S (plus k Z)
137+
138+We know, from the type of ``ih``, that ``k = plus k Z``, so we would
139+like to use this knowledge to replace ``plus k Z`` in the goal with
140+``k``. We can achieve this with the ``rewrite`` tactic:
141+
142+.. code-block:: idris
143+
144+ -plusredZ_S> rewrite ih
145+
146+ k : Nat
147+ ih : k = plus k Z
148+ ---------------------------------- (plusredZ_S) --------
149+ {hole3} : S k = S k
150+
151+ -plusredZ_S>
152+
153+The ``rewrite`` tactic takes an equality proof as an argument, and tries
154+to rewrite the goal using that proof. Here, it results in an equality
155+which is trivially provable:
156+
157+.. code-block:: idris
158+
159+ -plusredZ_S> trivial
160+ plusredZ_S: no more goals
161+ -plusredZ_S> qed
162+ plusredZ_S = proof {
163+ intros;
164+ rewrite ih;
165+ trivial;
166+ }
167+
168+Again, we can add this proof to the end of our source file using the
169+``:addproof`` command at the interactive prompt.