| author | haftmann | 
| Wed, 15 Sep 2010 12:16:35 +0200 | |
| changeset 39393 | 7565c649e7dd | 
| parent 39359 | 6f49c7fbb1b1 | 
| child 40147 | d170c322157a | 
| permissions | -rw-r--r-- | 
| 33191 | 1 | \documentclass[a4paper,12pt]{article}
 | 
| 2 | \usepackage[T1]{fontenc}
 | |
| 3 | \usepackage{amsmath}
 | |
| 4 | \usepackage{amssymb}
 | |
| 33564 
75ce0f60617a
fixed minor problems with Nitpick's documentation
 blanchet parents: 
33561diff
changeset | 5 | \usepackage[english,french]{babel}
 | 
| 33191 | 6 | \usepackage{color}
 | 
| 35695 | 7 | \usepackage{footmisc}
 | 
| 33191 | 8 | \usepackage{graphicx}
 | 
| 9 | %\usepackage{mathpazo}
 | |
| 10 | \usepackage{multicol}
 | |
| 11 | \usepackage{stmaryrd}
 | |
| 12 | %\usepackage[scaled=.85]{beramono}
 | |
| 13 | \usepackage{../iman,../pdfsetup}
 | |
| 14 | ||
| 15 | %\oddsidemargin=4.6mm | |
| 16 | %\evensidemargin=4.6mm | |
| 17 | %\textwidth=150mm | |
| 18 | %\topmargin=4.6mm | |
| 19 | %\headheight=0mm | |
| 20 | %\headsep=0mm | |
| 21 | %\textheight=234mm | |
| 22 | ||
| 23 | \def\Colon{\mathord{:\mkern-1.5mu:}}
 | |
| 24 | %\def\lbrakk{\mathopen{\lbrack\mkern-3.25mu\lbrack}}
 | |
| 25 | %\def\rbrakk{\mathclose{\rbrack\mkern-3.255mu\rbrack}}
 | |
| 26 | \def\lparr{\mathopen{(\mkern-4mu\mid}}
 | |
| 27 | \def\rparr{\mathclose{\mid\mkern-4mu)}}
 | |
| 28 | ||
| 29 | \def\unk{{?}}
 | |
| 34982 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 30 | \def\undef{(\lambda x.\; \unk)}
 | 
| 33191 | 31 | %\def\unr{\textit{others}}
 | 
| 32 | \def\unr{\ldots}
 | |
| 33 | \def\Abs#1{\hbox{\rm{\flqq}}{\,#1\,}\hbox{\rm{\frqq}}}
 | |
| 34 | \def\Q{{\smash{\lower.2ex\hbox{$\scriptstyle?$}}}}
 | |
| 35 | ||
| 36 | \hyphenation{Mini-Sat size-change First-Steps grand-parent nit-pick
 | |
| 37 | counter-example counter-examples data-type data-types co-data-type | |
| 38 | co-data-types in-duc-tive co-in-duc-tive} | |
| 39 | ||
| 40 | \urlstyle{tt}
 | |
| 41 | ||
| 42 | \begin{document}
 | |
| 43 | ||
| 33564 
75ce0f60617a
fixed minor problems with Nitpick's documentation
 blanchet parents: 
33561diff
changeset | 44 | \selectlanguage{english}
 | 
| 
75ce0f60617a
fixed minor problems with Nitpick's documentation
 blanchet parents: 
33561diff
changeset | 45 | |
| 33191 | 46 | \title{\includegraphics[scale=0.5]{isabelle_nitpick} \\[4ex]
 | 
| 47 | Picking Nits \\[\smallskipamount] | |
| 33887 | 48 | \Large A User's Guide to Nitpick for Isabelle/HOL} | 
| 33191 | 49 | \author{\hbox{} \\
 | 
| 50 | Jasmin Christian Blanchette \\ | |
| 33887 | 51 | {\normalsize Institut f\"ur Informatik, Technische Universit\"at M\"unchen} \\
 | 
| 33191 | 52 | \hbox{}}
 | 
| 53 | ||
| 54 | \maketitle | |
| 55 | ||
| 56 | \tableofcontents | |
| 57 | ||
| 58 | \setlength{\parskip}{.7em plus .2em minus .1em}
 | |
| 59 | \setlength{\parindent}{0pt}
 | |
| 60 | \setlength{\abovedisplayskip}{\parskip}
 | |
| 61 | \setlength{\abovedisplayshortskip}{.9\parskip}
 | |
| 62 | \setlength{\belowdisplayskip}{\parskip}
 | |
| 63 | \setlength{\belowdisplayshortskip}{.9\parskip}
 | |
| 64 | ||
| 65 | % General-purpose enum environment with correct spacing | |
| 66 | \newenvironment{enum}%
 | |
| 67 |     {\begin{list}{}{%
 | |
| 68 |         \setlength{\topsep}{.1\parskip}%
 | |
| 69 |         \setlength{\partopsep}{.1\parskip}%
 | |
| 70 |         \setlength{\itemsep}{\parskip}%
 | |
| 71 | \advance\itemsep by-\parsep}} | |
| 72 |     {\end{list}}
 | |
| 73 | ||
| 74 | \def\pre{\begingroup\vskip0pt plus1ex\advance\leftskip by\leftmargin
 | |
| 75 | \advance\rightskip by\leftmargin} | |
| 76 | \def\post{\vskip0pt plus1ex\endgroup}
 | |
| 77 | ||
| 78 | \def\prew{\pre\advance\rightskip by-\leftmargin}
 | |
| 79 | \def\postw{\post}
 | |
| 80 | ||
| 81 | \section{Introduction}
 | |
| 82 | \label{introduction}
 | |
| 83 | ||
| 36926 | 84 | Nitpick \cite{blanchette-nipkow-2010} is a counterexample generator for
 | 
| 33191 | 85 | Isabelle/HOL \cite{isa-tutorial} that is designed to handle formulas
 | 
| 86 | combining (co)in\-duc\-tive datatypes, (co)in\-duc\-tively defined predicates, and | |
| 87 | quantifiers. It builds on Kodkod \cite{torlak-jackson-2007}, a highly optimized
 | |
| 88 | first-order relational model finder developed by the Software Design Group at | |
| 89 | MIT. It is conceptually similar to Refute \cite{weber-2008}, from which it
 | |
| 90 | borrows many ideas and code fragments, but it benefits from Kodkod's | |
| 91 | optimizations and a new encoding scheme. The name Nitpick is shamelessly | |
| 92 | appropriated from a now retired Alloy precursor. | |
| 93 | ||
| 94 | Nitpick is easy to use---you simply enter \textbf{nitpick} after a putative
 | |
| 95 | theorem and wait a few seconds. Nonetheless, there are situations where knowing | |
| 96 | how it works under the hood and how it reacts to various options helps | |
| 97 | increase the test coverage. This manual also explains how to install the tool on | |
| 98 | your workstation. Should the motivation fail you, think of the many hours of | |
| 99 | hard work Nitpick will save you. Proving non-theorems is \textsl{hard work}.
 | |
| 100 | ||
| 101 | Another common use of Nitpick is to find out whether the axioms of a locale are | |
| 102 | satisfiable, while the locale is being developed. To check this, it suffices to | |
| 103 | write | |
| 104 | ||
| 105 | \prew | |
| 106 | \textbf{lemma}~``$\textit{False}$'' \\
 | |
| 107 | \textbf{nitpick}~[\textit{show\_all}]
 | |
| 108 | \postw | |
| 109 | ||
| 110 | after the locale's \textbf{begin} keyword. To falsify \textit{False}, Nitpick
 | |
| 111 | must find a model for the axioms. If it finds no model, we have an indication | |
| 112 | that the axioms might be unsatisfiable. | |
| 113 | ||
| 36926 | 114 | You can also invoke Nitpick from the ``Commands'' submenu of the | 
| 115 | ``Isabelle'' menu in Proof General or by pressing the Emacs key sequence C-c C-a | |
| 116 | C-n. This is equivalent to entering the \textbf{nitpick} command with no
 | |
| 117 | arguments in the theory text. | |
| 118 | ||
| 38517 | 119 | Nitpick requires the Kodkodi package for Isabelle as well as a Java 1.5 virtual | 
| 33195 
0efe26262e73
updated Nitpick manual to reflect the latest Stand der Dinge
 blanchet parents: 
33193diff
changeset | 120 | machine called \texttt{java}. The examples presented in this manual can be found
 | 
| 
0efe26262e73
updated Nitpick manual to reflect the latest Stand der Dinge
 blanchet parents: 
33193diff
changeset | 121 | in Isabelle's \texttt{src/HOL/Nitpick\_Examples/Manual\_Nits.thy} theory.
 | 
| 
0efe26262e73
updated Nitpick manual to reflect the latest Stand der Dinge
 blanchet parents: 
33193diff
changeset | 122 | |
| 33561 
ab01b72715ef
introduced Auto Nitpick in addition to Auto Quickcheck;
 blanchet parents: 
33559diff
changeset | 123 | Throughout this manual, we will explicitly invoke the \textbf{nitpick} command.
 | 
| 39317 | 124 | Nitpick also provides an automatic mode that can be enabled via the ``Auto | 
| 125 | Nitpick'' option from the ``Isabelle'' menu in Proof General. In this mode, | |
| 126 | Nitpick is run on every newly entered theorem. The time limit for Auto Nitpick | |
| 127 | and other automatic tools can be set using the ``Auto Tools Time Limit'' option. | |
| 33561 
ab01b72715ef
introduced Auto Nitpick in addition to Auto Quickcheck;
 blanchet parents: 
33559diff
changeset | 128 | |
| 33191 | 129 | \newbox\boxA | 
| 130 | \setbox\boxA=\hbox{\texttt{nospam}}
 | |
| 131 | ||
| 132 | The known bugs and limitations at the time of writing are listed in | |
| 133 | \S\ref{known-bugs-and-limitations}. Comments and bug reports concerning Nitpick
 | |
| 134 | or this manual should be directed to | |
| 135 | \texttt{blan{\color{white}nospam}\kern-\wd\boxA{}chette@\allowbreak
 | |
| 136 | in.\allowbreak tum.\allowbreak de}. | |
| 137 | ||
| 138 | \vskip2.5\smallskipamount | |
| 139 | ||
| 140 | \textbf{Acknowledgment.} The author would like to thank Mark Summerfield for
 | |
| 141 | suggesting several textual improvements. | |
| 142 | % and Perry James for reporting a typo. | |
| 143 | ||
| 36926 | 144 | %\section{Installation}
 | 
| 145 | %\label{installation}
 | |
| 146 | % | |
| 147 | %MISSING: | |
| 148 | % | |
| 149 | % * Nitpick is part of Isabelle/HOL | |
| 150 | % * but it relies on an external tool called Kodkodi (Kodkod wrapper) | |
| 151 | % * Two options: | |
| 152 | % * if you use a prebuilt Isabelle package, Kodkodi is automatically there | |
| 153 | % * if you work from sources, the latest Kodkodi can be obtained from ... | |
| 154 | % download it, install it in some directory of your choice (e.g., | |
| 155 | % $ISABELLE_HOME/contrib/kodkodi), and add the absolute path to Kodkodi | |
| 156 | % in your .isabelle/etc/components file | |
| 157 | % | |
| 158 | % * If you're not sure, just try the example in the next section | |
| 159 | ||
| 35712 
77aa29bf14ee
added a mechanism to Nitpick to support custom rendering of terms, and used it for multisets
 blanchet parents: 
35710diff
changeset | 160 | \section{First Steps}
 | 
| 
77aa29bf14ee
added a mechanism to Nitpick to support custom rendering of terms, and used it for multisets
 blanchet parents: 
35710diff
changeset | 161 | \label{first-steps}
 | 
| 33191 | 162 | |
| 163 | This section introduces Nitpick by presenting small examples. If possible, you | |
| 164 | should try out the examples on your workstation. Your theory file should start | |
| 35284 
9edc2bd6d2bd
enabled Nitpick's support for quotient types + shortened the Nitpick tests a bit
 blanchet parents: 
35220diff
changeset | 165 | as follows: | 
| 33191 | 166 | |
| 167 | \prew | |
| 168 | \textbf{theory}~\textit{Scratch} \\
 | |
| 35665 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35386diff
changeset | 169 | \textbf{imports}~\textit{Main~Quotient\_Product~RealDef} \\
 | 
| 33191 | 170 | \textbf{begin}
 | 
| 171 | \postw | |
| 172 | ||
| 35710 | 173 | The results presented here were obtained using the JNI (Java Native Interface) | 
| 174 | version of MiniSat and with multithreading disabled to reduce nondeterminism. | |
| 175 | This was done by adding the line | |
| 33191 | 176 | |
| 177 | \prew | |
| 35710 | 178 | \textbf{nitpick\_params} [\textit{sat\_solver}~= \textit{MiniSat\_JNI}, \,\textit{max\_threads}~= 1]
 | 
| 33191 | 179 | \postw | 
| 180 | ||
| 181 | after the \textbf{begin} keyword. The JNI version of MiniSat is bundled with
 | |
| 182 | Kodkodi and is precompiled for the major platforms. Other SAT solvers can also | |
| 183 | be installed, as explained in \S\ref{optimizations}. If you have already
 | |
| 184 | configured SAT solvers in Isabelle (e.g., for Refute), these will also be | |
| 185 | available to Nitpick. | |
| 186 | ||
| 187 | \subsection{Propositional Logic}
 | |
| 188 | \label{propositional-logic}
 | |
| 189 | ||
| 190 | Let's start with a trivial example from propositional logic: | |
| 191 | ||
| 192 | \prew | |
| 193 | \textbf{lemma}~``$P \longleftrightarrow Q$'' \\
 | |
| 194 | \textbf{nitpick}
 | |
| 195 | \postw | |
| 196 | ||
| 197 | You should get the following output: | |
| 198 | ||
| 199 | \prew | |
| 200 | \slshape | |
| 201 | Nitpick found a counterexample: \\[2\smallskipamount] | |
| 202 | \hbox{}\qquad Free variables: \nopagebreak \\
 | |
| 203 | \hbox{}\qquad\qquad $P = \textit{True}$ \\
 | |
| 204 | \hbox{}\qquad\qquad $Q = \textit{False}$
 | |
| 205 | \postw | |
| 206 | ||
| 36926 | 207 | %FIXME: If you get the output:... | 
| 208 | %Then do such-and-such. | |
| 209 | ||
| 33191 | 210 | Nitpick can also be invoked on individual subgoals, as in the example below: | 
| 211 | ||
| 212 | \prew | |
| 213 | \textbf{apply}~\textit{auto} \\[2\smallskipamount]
 | |
| 214 | {\slshape goal (2 subgoals): \\
 | |
| 34982 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 215 | \phantom{0}1. $P\,\Longrightarrow\, Q$ \\
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 216 | \phantom{0}2. $Q\,\Longrightarrow\, P$} \\[2\smallskipamount]
 | 
| 33191 | 217 | \textbf{nitpick}~1 \\[2\smallskipamount]
 | 
| 218 | {\slshape Nitpick found a counterexample: \\[2\smallskipamount]
 | |
| 219 | \hbox{}\qquad Free variables: \nopagebreak \\
 | |
| 220 | \hbox{}\qquad\qquad $P = \textit{True}$ \\
 | |
| 221 | \hbox{}\qquad\qquad $Q = \textit{False}$} \\[2\smallskipamount]
 | |
| 222 | \textbf{nitpick}~2 \\[2\smallskipamount]
 | |
| 223 | {\slshape Nitpick found a counterexample: \\[2\smallskipamount]
 | |
| 224 | \hbox{}\qquad Free variables: \nopagebreak \\
 | |
| 225 | \hbox{}\qquad\qquad $P = \textit{False}$ \\
 | |
| 226 | \hbox{}\qquad\qquad $Q = \textit{True}$} \\[2\smallskipamount]
 | |
| 227 | \textbf{oops}
 | |
| 228 | \postw | |
| 229 | ||
| 230 | \subsection{Type Variables}
 | |
| 231 | \label{type-variables}
 | |
| 232 | ||
| 233 | If you are left unimpressed by the previous example, don't worry. The next | |
| 234 | one is more mind- and computer-boggling: | |
| 235 | ||
| 236 | \prew | |
| 237 | \textbf{lemma} ``$P~x\,\Longrightarrow\, P~(\textrm{THE}~y.\;P~y)$''
 | |
| 238 | \postw | |
| 239 | \pagebreak[2] %% TYPESETTING | |
| 240 | ||
| 241 | The putative lemma involves the definite description operator, {THE}, presented
 | |
| 242 | in section 5.10.1 of the Isabelle tutorial \cite{isa-tutorial}. The
 | |
| 243 | operator is defined by the axiom $(\textrm{THE}~x.\; x = a) = a$. The putative
 | |
| 244 | lemma is merely asserting the indefinite description operator axiom with {THE}
 | |
| 245 | substituted for {SOME}.
 | |
| 246 | ||
| 247 | The free variable $x$ and the bound variable $y$ have type $'a$. For formulas | |
| 248 | containing type variables, Nitpick enumerates the possible domains for each type | |
| 38181 | 249 | variable, up to a given cardinality (10 by default), looking for a finite | 
| 33191 | 250 | countermodel: | 
| 251 | ||
| 252 | \prew | |
| 253 | \textbf{nitpick} [\textit{verbose}] \\[2\smallskipamount]
 | |
| 254 | \slshape | |
| 38181 | 255 | Trying 10 scopes: \nopagebreak \\ | 
| 33191 | 256 | \hbox{}\qquad \textit{card}~$'a$~= 1; \\
 | 
| 257 | \hbox{}\qquad \textit{card}~$'a$~= 2; \\
 | |
| 258 | \hbox{}\qquad $\qquad\vdots$ \\[.5\smallskipamount]
 | |
| 38181 | 259 | \hbox{}\qquad \textit{card}~$'a$~= 10. \\[2\smallskipamount]
 | 
| 33191 | 260 | Nitpick found a counterexample for \textit{card} $'a$~= 3: \\[2\smallskipamount]
 | 
| 261 | \hbox{}\qquad Free variables: \nopagebreak \\
 | |
| 262 | \hbox{}\qquad\qquad $P = \{a_2,\, a_3\}$ \\
 | |
| 263 | \hbox{}\qquad\qquad $x = a_3$ \\[2\smallskipamount]
 | |
| 38183 | 264 | Total time: 768 ms. | 
| 33191 | 265 | \postw | 
| 266 | ||
| 267 | Nitpick found a counterexample in which $'a$ has cardinality 3. (For | |
| 268 | cardinalities 1 and 2, the formula holds.) In the counterexample, the three | |
| 269 | values of type $'a$ are written $a_1$, $a_2$, and $a_3$. | |
| 270 | ||
| 271 | The message ``Trying $n$ scopes: {\ldots}''\ is shown only if the option
 | |
| 272 | \textit{verbose} is enabled. You can specify \textit{verbose} each time you
 | |
| 273 | invoke \textbf{nitpick}, or you can set it globally using the command
 | |
| 274 | ||
| 275 | \prew | |
| 276 | \textbf{nitpick\_params} [\textit{verbose}]
 | |
| 277 | \postw | |
| 278 | ||
| 279 | This command also displays the current default values for all of the options | |
| 280 | supported by Nitpick. The options are listed in \S\ref{option-reference}.
 | |
| 281 | ||
| 282 | \subsection{Constants}
 | |
| 283 | \label{constants}
 | |
| 284 | ||
| 285 | By just looking at Nitpick's output, it might not be clear why the | |
| 286 | counterexample in \S\ref{type-variables} is genuine. Let's invoke Nitpick again,
 | |
| 287 | this time telling it to show the values of the constants that occur in the | |
| 288 | formula: | |
| 289 | ||
| 290 | \prew | |
| 291 | \textbf{lemma}~``$P~x\,\Longrightarrow\, P~(\textrm{THE}~y.\;P~y)$'' \\
 | |
| 292 | \textbf{nitpick}~[\textit{show\_consts}] \\[2\smallskipamount]
 | |
| 293 | \slshape | |
| 294 | Nitpick found a counterexample for \textit{card} $'a$~= 3: \\[2\smallskipamount]
 | |
| 295 | \hbox{}\qquad Free variables: \nopagebreak \\
 | |
| 296 | \hbox{}\qquad\qquad $P = \{a_2,\, a_3\}$ \\
 | |
| 297 | \hbox{}\qquad\qquad $x = a_3$ \\
 | |
| 298 | \hbox{}\qquad Constant: \nopagebreak \\
 | |
| 39359 | 299 | \hbox{}\qquad\qquad $\hbox{\slshape THE}~y.\;P~y = a_1$
 | 
| 33191 | 300 | \postw | 
| 301 | ||
| 39359 | 302 | As the result of an optimization, Nitpick directly assigned a value to the | 
| 303 | subterm $\textrm{THE}~y.\;P~y$, rather than to the \textit{The} constant. If we
 | |
| 304 | disable this optimization by using the command | |
| 33191 | 305 | |
| 306 | \prew | |
| 39359 | 307 | \textbf{nitpick}~[\textit{dont\_specialize},\, \textit{show\_consts}]
 | 
| 33191 | 308 | \postw | 
| 309 | ||
| 39359 | 310 | we get \textit{The}:
 | 
| 33191 | 311 | |
| 312 | \prew | |
| 313 | \slshape Constant: \nopagebreak \\ | |
| 314 | \hbox{}\qquad $\mathit{The} = \undef{}
 | |
| 315 |     (\!\begin{aligned}[t]%
 | |
| 35078 
6fd1052fe463
optimization to quantifiers in Nitpick's handling of simp rules + renamed some SAT solvers
 blanchet parents: 
35072diff
changeset | 316 |     & \{a_1, a_2, a_3\} := a_3,\> \{a_1, a_2\} := a_3,\> \{a_1, a_3\} := a_3, \\[-2pt] %% TYPESETTING
 | 
| 
6fd1052fe463
optimization to quantifiers in Nitpick's handling of simp rules + renamed some SAT solvers
 blanchet parents: 
35072diff
changeset | 317 |     & \{a_1\} := a_1,\> \{a_2, a_3\} := a_1,\> \{a_2\} := a_2, \\[-2pt]
 | 
| 
6fd1052fe463
optimization to quantifiers in Nitpick's handling of simp rules + renamed some SAT solvers
 blanchet parents: 
35072diff
changeset | 318 |     & \{a_3\} := a_3,\> \{\} := a_3)\end{aligned}$
 | 
| 33191 | 319 | \postw | 
| 320 | ||
| 321 | Notice that $\textit{The}~(\lambda y.\;P~y) = \textit{The}~\{a_2, a_3\} = a_1$,
 | |
| 34982 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 322 | just like before.\footnote{The Isabelle/HOL notation $f(x :=
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 323 | y)$ denotes the function that maps $x$ to $y$ and that otherwise behaves like | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 324 | $f$.} | 
| 33191 | 325 | |
| 326 | Our misadventures with THE suggest adding `$\exists!x{.}$' (``there exists a
 | |
| 327 | unique $x$ such that'') at the front of our putative lemma's assumption: | |
| 328 | ||
| 329 | \prew | |
| 330 | \textbf{lemma}~``$\exists {!}x.\; P~x\,\Longrightarrow\, P~(\textrm{THE}~y.\;P~y)$''
 | |
| 331 | \postw | |
| 332 | ||
| 333 | The fix appears to work: | |
| 334 | ||
| 335 | \prew | |
| 336 | \textbf{nitpick} \\[2\smallskipamount]
 | |
| 337 | \slshape Nitpick found no counterexample. | |
| 338 | \postw | |
| 339 | ||
| 340 | We can further increase our confidence in the formula by exhausting all | |
| 341 | cardinalities up to 50: | |
| 342 | ||
| 343 | \prew | |
| 344 | \textbf{nitpick} [\textit{card} $'a$~= 1--50]\footnote{The symbol `--'
 | |
| 345 | can be entered as \texttt{-} (hyphen) or
 | |
| 346 | \texttt{\char`\\\char`\<midarrow\char`\>}.} \\[2\smallskipamount]
 | |
| 347 | \slshape Nitpick found no counterexample. | |
| 348 | \postw | |
| 349 | ||
| 38181 | 350 | Let's see if Sledgehammer can find a proof: | 
| 33191 | 351 | |
| 352 | \prew | |
| 353 | \textbf{sledgehammer} \\[2\smallskipamount]
 | |
| 354 | {\slshape Sledgehammer: external prover ``$e$'' for subgoal 1: \\
 | |
| 355 | $\exists{!}x.\; P~x\,\Longrightarrow\, P~(\hbox{\slshape THE}~y.\; P~y)$ \\
 | |
| 356 | Try this command: \textrm{apply}~(\textit{metis~the\_equality})} \\[2\smallskipamount]
 | |
| 357 | \textbf{apply}~(\textit{metis~the\_equality\/}) \nopagebreak \\[2\smallskipamount]
 | |
| 358 | {\slshape No subgoals!}% \\[2\smallskipamount]
 | |
| 359 | %\textbf{done}
 | |
| 360 | \postw | |
| 361 | ||
| 362 | This must be our lucky day. | |
| 363 | ||
| 364 | \subsection{Skolemization}
 | |
| 365 | \label{skolemization}
 | |
| 366 | ||
| 367 | Are all invertible functions onto? Let's find out: | |
| 368 | ||
| 369 | \prew | |
| 370 | \textbf{lemma} ``$\exists g.\; \forall x.~g~(f~x) = x
 | |
| 371 | \,\Longrightarrow\, \forall y.\; \exists x.~y = f~x$'' \\ | |
| 372 | \textbf{nitpick} \\[2\smallskipamount]
 | |
| 373 | \slshape | |
| 374 | Nitpick found a counterexample for \textit{card} $'a$~= 2 and \textit{card} $'b$~=~1: \\[2\smallskipamount]
 | |
| 375 | \hbox{}\qquad Free variable: \nopagebreak \\
 | |
| 376 | \hbox{}\qquad\qquad $f = \undef{}(b_1 := a_1)$ \\
 | |
| 377 | \hbox{}\qquad Skolem constants: \nopagebreak \\
 | |
| 378 | \hbox{}\qquad\qquad $g = \undef{}(a_1 := b_1,\> a_2 := b_1)$ \\
 | |
| 379 | \hbox{}\qquad\qquad $y = a_2$
 | |
| 380 | \postw | |
| 381 | ||
| 382 | Although $f$ is the only free variable occurring in the formula, Nitpick also | |
| 383 | displays values for the bound variables $g$ and $y$. These values are available | |
| 384 | to Nitpick because it performs skolemization as a preprocessing step. | |
| 385 | ||
| 386 | In the previous example, skolemization only affected the outermost quantifiers. | |
| 387 | This is not always the case, as illustrated below: | |
| 388 | ||
| 389 | \prew | |
| 390 | \textbf{lemma} ``$\exists x.\; \forall f.\; f~x = x$'' \\
 | |
| 391 | \textbf{nitpick} \\[2\smallskipamount]
 | |
| 392 | \slshape | |
| 393 | Nitpick found a counterexample for \textit{card} $'a$~= 2: \\[2\smallskipamount]
 | |
| 394 | \hbox{}\qquad Skolem constant: \nopagebreak \\
 | |
| 395 | \hbox{}\qquad\qquad $\lambda x.\; f =
 | |
| 396 |     \undef{}(\!\begin{aligned}[t]
 | |
| 397 |     & a_1 := \undef{}(a_1 := a_2,\> a_2 := a_1), \\[-2pt]
 | |
| 398 |     & a_2 := \undef{}(a_1 := a_1,\> a_2 := a_1))\end{aligned}$
 | |
| 399 | \postw | |
| 400 | ||
| 401 | The variable $f$ is bound within the scope of $x$; therefore, $f$ depends on | |
| 402 | $x$, as suggested by the notation $\lambda x.\,f$. If $x = a_1$, then $f$ is the | |
| 403 | function that maps $a_1$ to $a_2$ and vice versa; otherwise, $x = a_2$ and $f$ | |
| 404 | maps both $a_1$ and $a_2$ to $a_1$. In both cases, $f~x \not= x$. | |
| 405 | ||
| 406 | The source of the Skolem constants is sometimes more obscure: | |
| 407 | ||
| 408 | \prew | |
| 409 | \textbf{lemma} ``$\mathit{refl}~r\,\Longrightarrow\, \mathit{sym}~r$'' \\
 | |
| 410 | \textbf{nitpick} \\[2\smallskipamount]
 | |
| 411 | \slshape | |
| 412 | Nitpick found a counterexample for \textit{card} $'a$~= 2: \\[2\smallskipamount]
 | |
| 413 | \hbox{}\qquad Free variable: \nopagebreak \\
 | |
| 414 | \hbox{}\qquad\qquad $r = \{(a_1, a_1),\, (a_2, a_1),\, (a_2, a_2)\}$ \\
 | |
| 415 | \hbox{}\qquad Skolem constants: \nopagebreak \\
 | |
| 416 | \hbox{}\qquad\qquad $\mathit{sym}.x = a_2$ \\
 | |
| 417 | \hbox{}\qquad\qquad $\mathit{sym}.y = a_1$
 | |
| 418 | \postw | |
| 419 | ||
| 420 | What happened here is that Nitpick expanded the \textit{sym} constant to its
 | |
| 421 | definition: | |
| 422 | ||
| 423 | \prew | |
| 424 | $\mathit{sym}~r \,\equiv\,
 | |
| 425 | \forall x\> y.\,\> (x, y) \in r \longrightarrow (y, x) \in r.$ | |
| 426 | \postw | |
| 427 | ||
| 428 | As their names suggest, the Skolem constants $\mathit{sym}.x$ and
 | |
| 429 | $\mathit{sym}.y$ are simply the bound variables $x$ and $y$
 | |
| 430 | from \textit{sym}'s definition.
 | |
| 431 | ||
| 432 | \subsection{Natural Numbers and Integers}
 | |
| 433 | \label{natural-numbers-and-integers}
 | |
| 434 | ||
| 435 | Because of the axiom of infinity, the type \textit{nat} does not admit any
 | |
| 34124 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 436 | finite models. To deal with this, Nitpick's approach is to consider finite | 
| 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 437 | subsets $N$ of \textit{nat} and maps all numbers $\notin N$ to the undefined
 | 
| 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 438 | value (displayed as `$\unk$'). The type \textit{int} is handled similarly.
 | 
| 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 439 | Internally, undefined values lead to a three-valued logic. | 
| 33191 | 440 | |
| 35284 
9edc2bd6d2bd
enabled Nitpick's support for quotient types + shortened the Nitpick tests a bit
 blanchet parents: 
35220diff
changeset | 441 | Here is an example involving \textit{int\/}:
 | 
| 33191 | 442 | |
| 443 | \prew | |
| 444 | \textbf{lemma} ``$\lbrakk i \le j;\> n \le (m{\Colon}\mathit{int})\rbrakk \,\Longrightarrow\, i * n + j * m \le i * m + j * n$'' \\
 | |
| 445 | \textbf{nitpick} \\[2\smallskipamount]
 | |
| 446 | \slshape Nitpick found a counterexample: \\[2\smallskipamount] | |
| 447 | \hbox{}\qquad Free variables: \nopagebreak \\
 | |
| 448 | \hbox{}\qquad\qquad $i = 0$ \\
 | |
| 449 | \hbox{}\qquad\qquad $j = 1$ \\
 | |
| 450 | \hbox{}\qquad\qquad $m = 1$ \\
 | |
| 451 | \hbox{}\qquad\qquad $n = 0$
 | |
| 452 | \postw | |
| 453 | ||
| 34124 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 454 | Internally, Nitpick uses either a unary or a binary representation of numbers. | 
| 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 455 | The unary representation is more efficient but only suitable for numbers very | 
| 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 456 | close to zero. By default, Nitpick attempts to choose the more appropriate | 
| 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 457 | encoding by inspecting the formula at hand. This behavior can be overridden by | 
| 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 458 | passing either \textit{unary\_ints} or \textit{binary\_ints} as option. For
 | 
| 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 459 | binary notation, the number of bits to use can be specified using | 
| 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 460 | the \textit{bits} option. For example:
 | 
| 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 461 | |
| 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 462 | \prew | 
| 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 463 | \textbf{nitpick} [\textit{binary\_ints}, \textit{bits}${} = 16$]
 | 
| 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 464 | \postw | 
| 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 465 | |
| 33191 | 466 | With infinite types, we don't always have the luxury of a genuine counterexample | 
| 467 | and must often content ourselves with a potential one. The tedious task of | |
| 468 | finding out whether the potential counterexample is in fact genuine can be | |
| 34124 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 469 | outsourced to \textit{auto} by passing \textit{check\_potential}. For example:
 | 
| 33191 | 470 | |
| 471 | \prew | |
| 472 | \textbf{lemma} ``$\forall n.\; \textit{Suc}~n \mathbin{\not=} n \,\Longrightarrow\, P$'' \\
 | |
| 35712 
77aa29bf14ee
added a mechanism to Nitpick to support custom rendering of terms, and used it for multisets
 blanchet parents: 
35710diff
changeset | 473 | \textbf{nitpick} [\textit{card~nat}~= 50, \textit{check\_potential}] \\[2\smallskipamount]
 | 
| 35385 
29f81babefd7
improved precision of infinite "shallow" datatypes in Nitpick;
 blanchet parents: 
35335diff
changeset | 474 | \slshape Warning: The conjecture either trivially holds for the given scopes or lies outside Nitpick's supported | 
| 35185 
9b8f351cced6
added yet another hint to Nitpick's output, this time warning about problems for which nothing was effectively tested
 blanchet parents: 
35183diff
changeset | 475 | fragment. Only potential counterexamples may be found. \\[2\smallskipamount] | 
| 
9b8f351cced6
added yet another hint to Nitpick's output, this time warning about problems for which nothing was effectively tested
 blanchet parents: 
35183diff
changeset | 476 | Nitpick found a potential counterexample: \\[2\smallskipamount] | 
| 33191 | 477 | \hbox{}\qquad Free variable: \nopagebreak \\
 | 
| 478 | \hbox{}\qquad\qquad $P = \textit{False}$ \\[2\smallskipamount]
 | |
| 479 | Confirmation by ``\textit{auto}'': The above counterexample is genuine.
 | |
| 480 | \postw | |
| 481 | ||
| 482 | You might wonder why the counterexample is first reported as potential. The root | |
| 483 | of the problem is that the bound variable in $\forall n.\; \textit{Suc}~n
 | |
| 484 | \mathbin{\not=} n$ ranges over an infinite type. If Nitpick finds an $n$ such
 | |
| 485 | that $\textit{Suc}~n \mathbin{=} n$, it evaluates the assumption to
 | |
| 486 | \textit{False}; but otherwise, it does not know anything about values of $n \ge
 | |
| 487 | \textit{card~nat}$ and must therefore evaluate the assumption to $\unk$, not
 | |
| 488 | \textit{True}. Since the assumption can never be satisfied, the putative lemma
 | |
| 489 | can never be falsified. | |
| 490 | ||
| 491 | Incidentally, if you distrust the so-called genuine counterexamples, you can | |
| 492 | enable \textit{check\_\allowbreak genuine} to verify them as well. However, be
 | |
| 34124 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 493 | aware that \textit{auto} will usually fail to prove that the counterexample is
 | 
| 33191 | 494 | genuine or spurious. | 
| 495 | ||
| 496 | Some conjectures involving elementary number theory make Nitpick look like a | |
| 497 | giant with feet of clay: | |
| 498 | ||
| 499 | \prew | |
| 500 | \textbf{lemma} ``$P~\textit{Suc}$'' \\
 | |
| 35309 
997aa3a3e4bb
catch IO errors in Nitpick's "kodkodi" invocation + shorten execution time of "Manual_Nits" example
 blanchet parents: 
35284diff
changeset | 501 | \textbf{nitpick} \\[2\smallskipamount]
 | 
| 33191 | 502 | \slshape | 
| 503 | Nitpick found no counterexample. | |
| 504 | \postw | |
| 505 | ||
| 34124 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 506 | On any finite set $N$, \textit{Suc} is a partial function; for example, if $N =
 | 
| 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 507 | \{0, 1, \ldots, k\}$, then \textit{Suc} is $\{0 \mapsto 1,\, 1 \mapsto 2,\,
 | 
| 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 508 | \ldots,\, k \mapsto \unk\}$, which evaluates to $\unk$ when passed as | 
| 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 509 | argument to $P$. As a result, $P~\textit{Suc}$ is always $\unk$. The next
 | 
| 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 510 | example is similar: | 
| 33191 | 511 | |
| 512 | \prew | |
| 513 | \textbf{lemma} ``$P~(\textit{op}~{+}\Colon
 | |
| 514 | \textit{nat}\mathbin{\Rightarrow}\textit{nat}\mathbin{\Rightarrow}\textit{nat})$'' \\
 | |
| 515 | \textbf{nitpick} [\textit{card nat} = 1] \\[2\smallskipamount]
 | |
| 516 | {\slshape Nitpick found a counterexample:} \\[2\smallskipamount]
 | |
| 517 | \hbox{}\qquad Free variable: \nopagebreak \\
 | |
| 518 | \hbox{}\qquad\qquad $P = \{\}$ \\[2\smallskipamount]
 | |
| 519 | \textbf{nitpick} [\textit{card nat} = 2] \\[2\smallskipamount]
 | |
| 520 | {\slshape Nitpick found no counterexample.}
 | |
| 521 | \postw | |
| 522 | ||
| 523 | The problem here is that \textit{op}~+ is total when \textit{nat} is taken to be
 | |
| 524 | $\{0\}$ but becomes partial as soon as we add $1$, because $1 + 1 \notin \{0,
 | |
| 525 | 1\}$. | |
| 526 | ||
| 527 | Because numbers are infinite and are approximated using a three-valued logic, | |
| 528 | there is usually no need to systematically enumerate domain sizes. If Nitpick | |
| 529 | cannot find a genuine counterexample for \textit{card~nat}~= $k$, it is very
 | |
| 530 | unlikely that one could be found for smaller domains. (The $P~(\textit{op}~{+})$
 | |
| 531 | example above is an exception to this principle.) Nitpick nonetheless enumerates | |
| 38181 | 532 | all cardinalities from 1 to 10 for \textit{nat}, mainly because smaller
 | 
| 33191 | 533 | cardinalities are fast to handle and give rise to simpler counterexamples. This | 
| 534 | is explained in more detail in \S\ref{scope-monotonicity}.
 | |
| 535 | ||
| 536 | \subsection{Inductive Datatypes}
 | |
| 537 | \label{inductive-datatypes}
 | |
| 538 | ||
| 539 | Like natural numbers and integers, inductive datatypes with recursive | |
| 540 | constructors admit no finite models and must be approximated by a subterm-closed | |
| 541 | subset. For example, using a cardinality of 10 for ${'}a~\textit{list}$,
 | |
| 542 | Nitpick looks for all counterexamples that can be built using at most 10 | |
| 543 | different lists. | |
| 544 | ||
| 545 | Let's see with an example involving \textit{hd} (which returns the first element
 | |
| 546 | of a list) and $@$ (which concatenates two lists): | |
| 547 | ||
| 548 | \prew | |
| 549 | \textbf{lemma} ``$\textit{hd}~(\textit{xs} \mathbin{@} [y, y]) = \textit{hd}~\textit{xs}$'' \\
 | |
| 550 | \textbf{nitpick} \\[2\smallskipamount]
 | |
| 551 | \slshape Nitpick found a counterexample for \textit{card} $'a$~= 3: \\[2\smallskipamount]
 | |
| 552 | \hbox{}\qquad Free variables: \nopagebreak \\
 | |
| 553 | \hbox{}\qquad\qquad $\textit{xs} = []$ \\
 | |
| 35078 
6fd1052fe463
optimization to quantifiers in Nitpick's handling of simp rules + renamed some SAT solvers
 blanchet parents: 
35072diff
changeset | 554 | \hbox{}\qquad\qquad $\textit{y} = a_1$
 | 
| 33191 | 555 | \postw | 
| 556 | ||
| 557 | To see why the counterexample is genuine, we enable \textit{show\_consts}
 | |
| 558 | and \textit{show\_\allowbreak datatypes}:
 | |
| 559 | ||
| 560 | \prew | |
| 561 | {\slshape Datatype:} \\
 | |
| 35078 
6fd1052fe463
optimization to quantifiers in Nitpick's handling of simp rules + renamed some SAT solvers
 blanchet parents: 
35072diff
changeset | 562 | \hbox{}\qquad $'a$~\textit{list}~= $\{[],\, [a_1],\, [a_1, a_1],\, \unr\}$ \\
 | 
| 33191 | 563 | {\slshape Constants:} \\
 | 
| 35078 
6fd1052fe463
optimization to quantifiers in Nitpick's handling of simp rules + renamed some SAT solvers
 blanchet parents: 
35072diff
changeset | 564 | \hbox{}\qquad $\lambda x_1.\; x_1 \mathbin{@} [y, y] = \undef([] := [a_1, a_1])$ \\
 | 
| 
6fd1052fe463
optimization to quantifiers in Nitpick's handling of simp rules + renamed some SAT solvers
 blanchet parents: 
35072diff
changeset | 565 | \hbox{}\qquad $\textit{hd} = \undef([] := a_2,\> [a_1] := a_1,\> [a_1, a_1] := a_1)$
 | 
| 33191 | 566 | \postw | 
| 567 | ||
| 568 | Since $\mathit{hd}~[]$ is undefined in the logic, it may be given any value,
 | |
| 569 | including $a_2$. | |
| 570 | ||
| 571 | The second constant, $\lambda x_1.\; x_1 \mathbin{@} [y, y]$, is simply the
 | |
| 35078 
6fd1052fe463
optimization to quantifiers in Nitpick's handling of simp rules + renamed some SAT solvers
 blanchet parents: 
35072diff
changeset | 572 | append operator whose second argument is fixed to be $[y, y]$. Appending $[a_1, | 
| 
6fd1052fe463
optimization to quantifiers in Nitpick's handling of simp rules + renamed some SAT solvers
 blanchet parents: 
35072diff
changeset | 573 | a_1]$ to $[a_1]$ would normally give $[a_1, a_1, a_1]$, but this value is not | 
| 33191 | 574 | representable in the subset of $'a$~\textit{list} considered by Nitpick, which
 | 
| 575 | is shown under the ``Datatype'' heading; hence the result is $\unk$. Similarly, | |
| 35078 
6fd1052fe463
optimization to quantifiers in Nitpick's handling of simp rules + renamed some SAT solvers
 blanchet parents: 
35072diff
changeset | 576 | appending $[a_1, a_1]$ to itself gives $\unk$. | 
| 33191 | 577 | |
| 578 | Given \textit{card}~$'a = 3$ and \textit{card}~$'a~\textit{list} = 3$, Nitpick
 | |
| 579 | considers the following subsets: | |
| 580 | ||
| 581 | \kern-.5\smallskipamount %% TYPESETTING | |
| 582 | ||
| 583 | \prew | |
| 584 | \begin{multicols}{3}
 | |
| 585 | $\{[],\, [a_1],\, [a_2]\}$; \\
 | |
| 586 | $\{[],\, [a_1],\, [a_3]\}$; \\
 | |
| 587 | $\{[],\, [a_2],\, [a_3]\}$; \\
 | |
| 588 | $\{[],\, [a_1],\, [a_1, a_1]\}$; \\
 | |
| 589 | $\{[],\, [a_1],\, [a_2, a_1]\}$; \\
 | |
| 590 | $\{[],\, [a_1],\, [a_3, a_1]\}$; \\
 | |
| 591 | $\{[],\, [a_2],\, [a_1, a_2]\}$; \\
 | |
| 592 | $\{[],\, [a_2],\, [a_2, a_2]\}$; \\
 | |
| 593 | $\{[],\, [a_2],\, [a_3, a_2]\}$; \\
 | |
| 594 | $\{[],\, [a_3],\, [a_1, a_3]\}$; \\
 | |
| 595 | $\{[],\, [a_3],\, [a_2, a_3]\}$; \\
 | |
| 596 | $\{[],\, [a_3],\, [a_3, a_3]\}$.
 | |
| 597 | \end{multicols}
 | |
| 598 | \postw | |
| 599 | ||
| 600 | \kern-2\smallskipamount %% TYPESETTING | |
| 601 | ||
| 602 | All subterm-closed subsets of $'a~\textit{list}$ consisting of three values
 | |
| 603 | are listed and only those. As an example of a non-subterm-closed subset, | |
| 35078 
6fd1052fe463
optimization to quantifiers in Nitpick's handling of simp rules + renamed some SAT solvers
 blanchet parents: 
35072diff
changeset | 604 | consider $\mathcal{S} = \{[],\, [a_1],\,\allowbreak [a_1, a_2]\}$, and observe
 | 
| 
6fd1052fe463
optimization to quantifiers in Nitpick's handling of simp rules + renamed some SAT solvers
 blanchet parents: 
35072diff
changeset | 605 | that $[a_1, a_2]$ (i.e., $a_1 \mathbin{\#} [a_2]$) has $[a_2] \notin
 | 
| 33191 | 606 | \mathcal{S}$ as a subterm.
 | 
| 607 | ||
| 608 | Here's another m\"ochtegern-lemma that Nitpick can refute without a blink: | |
| 609 | ||
| 610 | \prew | |
| 611 | \textbf{lemma} ``$\lbrakk \textit{length}~\textit{xs} = 1;\> \textit{length}~\textit{ys} = 1
 | |
| 612 | \rbrakk \,\Longrightarrow\, \textit{xs} = \textit{ys}$''
 | |
| 613 | \\ | |
| 614 | \textbf{nitpick} [\textit{show\_datatypes}] \\[2\smallskipamount]
 | |
| 615 | \slshape Nitpick found a counterexample for \textit{card} $'a$~= 3: \\[2\smallskipamount]
 | |
| 616 | \hbox{}\qquad Free variables: \nopagebreak \\
 | |
| 35078 
6fd1052fe463
optimization to quantifiers in Nitpick's handling of simp rules + renamed some SAT solvers
 blanchet parents: 
35072diff
changeset | 617 | \hbox{}\qquad\qquad $\textit{xs} = [a_1]$ \\
 | 
| 
6fd1052fe463
optimization to quantifiers in Nitpick's handling of simp rules + renamed some SAT solvers
 blanchet parents: 
35072diff
changeset | 618 | \hbox{}\qquad\qquad $\textit{ys} = [a_2]$ \\
 | 
| 33191 | 619 | \hbox{}\qquad Datatypes: \\
 | 
| 620 | \hbox{}\qquad\qquad $\textit{nat} = \{0,\, 1,\, 2,\, \unr\}$ \\
 | |
| 35078 
6fd1052fe463
optimization to quantifiers in Nitpick's handling of simp rules + renamed some SAT solvers
 blanchet parents: 
35072diff
changeset | 621 | \hbox{}\qquad\qquad $'a$~\textit{list} = $\{[],\, [a_1],\, [a_2],\, \unr\}$
 | 
| 33191 | 622 | \postw | 
| 623 | ||
| 624 | Because datatypes are approximated using a three-valued logic, there is usually | |
| 625 | no need to systematically enumerate cardinalities: If Nitpick cannot find a | |
| 626 | genuine counterexample for \textit{card}~$'a~\textit{list}$~= 10, it is very
 | |
| 627 | unlikely that one could be found for smaller cardinalities. | |
| 628 | ||
| 35284 
9edc2bd6d2bd
enabled Nitpick's support for quotient types + shortened the Nitpick tests a bit
 blanchet parents: 
35220diff
changeset | 629 | \subsection{Typedefs, Quotient Types, Records, Rationals, and Reals}
 | 
| 35712 
77aa29bf14ee
added a mechanism to Nitpick to support custom rendering of terms, and used it for multisets
 blanchet parents: 
35710diff
changeset | 630 | \label{typedefs-quotient-types-records-rationals-and-reals}
 | 
| 33191 | 631 | |
| 632 | Nitpick generally treats types declared using \textbf{typedef} as datatypes
 | |
| 633 | whose single constructor is the corresponding \textit{Abs\_\kern.1ex} function.
 | |
| 634 | For example: | |
| 635 | ||
| 636 | \prew | |
| 637 | \textbf{typedef}~\textit{three} = ``$\{0\Colon\textit{nat},\, 1,\, 2\}$'' \\
 | |
| 638 | \textbf{by}~\textit{blast} \\[2\smallskipamount]
 | |
| 639 | \textbf{definition}~$A \mathbin{\Colon} \textit{three}$ \textbf{where} ``\kern-.1em$A \,\equiv\, \textit{Abs\_\allowbreak three}~0$'' \\
 | |
| 640 | \textbf{definition}~$B \mathbin{\Colon} \textit{three}$ \textbf{where} ``$B \,\equiv\, \textit{Abs\_three}~1$'' \\
 | |
| 641 | \textbf{definition}~$C \mathbin{\Colon} \textit{three}$ \textbf{where} ``$C \,\equiv\, \textit{Abs\_three}~2$'' \\[2\smallskipamount]
 | |
| 642 | \textbf{lemma} ``$\lbrakk P~A;\> P~B\rbrakk \,\Longrightarrow\, P~x$'' \\
 | |
| 643 | \textbf{nitpick} [\textit{show\_datatypes}] \\[2\smallskipamount]
 | |
| 644 | \slshape Nitpick found a counterexample: \\[2\smallskipamount] | |
| 645 | \hbox{}\qquad Free variables: \nopagebreak \\
 | |
| 35078 
6fd1052fe463
optimization to quantifiers in Nitpick's handling of simp rules + renamed some SAT solvers
 blanchet parents: 
35072diff
changeset | 646 | \hbox{}\qquad\qquad $P = \{\Abs{0},\, \Abs{1}\}$ \\
 | 
| 33191 | 647 | \hbox{}\qquad\qquad $x = \Abs{2}$ \\
 | 
| 648 | \hbox{}\qquad Datatypes: \\
 | |
| 649 | \hbox{}\qquad\qquad $\textit{nat} = \{0,\, 1,\, 2,\, \unr\}$ \\
 | |
| 35078 
6fd1052fe463
optimization to quantifiers in Nitpick's handling of simp rules + renamed some SAT solvers
 blanchet parents: 
35072diff
changeset | 650 | \hbox{}\qquad\qquad $\textit{three} = \{\Abs{0},\, \Abs{1},\, \Abs{2},\, \unr\}$
 | 
| 33191 | 651 | \postw | 
| 652 | ||
| 653 | In the output above, $\Abs{n}$ abbreviates $\textit{Abs\_three}~n$.
 | |
| 654 | ||
| 35284 
9edc2bd6d2bd
enabled Nitpick's support for quotient types + shortened the Nitpick tests a bit
 blanchet parents: 
35220diff
changeset | 655 | Quotient types are handled in much the same way. The following fragment defines | 
| 
9edc2bd6d2bd
enabled Nitpick's support for quotient types + shortened the Nitpick tests a bit
 blanchet parents: 
35220diff
changeset | 656 | the integer type \textit{my\_int} by encoding the integer $x$ by a pair of
 | 
| 
9edc2bd6d2bd
enabled Nitpick's support for quotient types + shortened the Nitpick tests a bit
 blanchet parents: 
35220diff
changeset | 657 | natural numbers $(m, n)$ such that $x + n = m$: | 
| 
9edc2bd6d2bd
enabled Nitpick's support for quotient types + shortened the Nitpick tests a bit
 blanchet parents: 
35220diff
changeset | 658 | |
| 
9edc2bd6d2bd
enabled Nitpick's support for quotient types + shortened the Nitpick tests a bit
 blanchet parents: 
35220diff
changeset | 659 | \prew | 
| 
9edc2bd6d2bd
enabled Nitpick's support for quotient types + shortened the Nitpick tests a bit
 blanchet parents: 
35220diff
changeset | 660 | \textbf{fun} \textit{my\_int\_rel} \textbf{where} \\
 | 
| 
9edc2bd6d2bd
enabled Nitpick's support for quotient types + shortened the Nitpick tests a bit
 blanchet parents: 
35220diff
changeset | 661 | ``$\textit{my\_int\_rel}~(x,\, y)~(u,\, v) = (x + v = u + y)$'' \\[2\smallskipamount]
 | 
| 
9edc2bd6d2bd
enabled Nitpick's support for quotient types + shortened the Nitpick tests a bit
 blanchet parents: 
35220diff
changeset | 662 | % | 
| 
9edc2bd6d2bd
enabled Nitpick's support for quotient types + shortened the Nitpick tests a bit
 blanchet parents: 
35220diff
changeset | 663 | \textbf{quotient\_type}~\textit{my\_int} = ``$\textit{nat} \times \textit{nat\/}$''$\;{/}\;$\textit{my\_int\_rel} \\
 | 
| 
9edc2bd6d2bd
enabled Nitpick's support for quotient types + shortened the Nitpick tests a bit
 blanchet parents: 
35220diff
changeset | 664 | \textbf{by}~(\textit{auto simp add\/}:\ \textit{equivp\_def expand\_fun\_eq}) \\[2\smallskipamount]
 | 
| 
9edc2bd6d2bd
enabled Nitpick's support for quotient types + shortened the Nitpick tests a bit
 blanchet parents: 
35220diff
changeset | 665 | % | 
| 
9edc2bd6d2bd
enabled Nitpick's support for quotient types + shortened the Nitpick tests a bit
 blanchet parents: 
35220diff
changeset | 666 | \textbf{definition}~\textit{add\_raw}~\textbf{where} \\
 | 
| 
9edc2bd6d2bd
enabled Nitpick's support for quotient types + shortened the Nitpick tests a bit
 blanchet parents: 
35220diff
changeset | 667 | ``$\textit{add\_raw} \,\equiv\, \lambda(x,\, y)~(u,\, v).\; (x + (u\Colon\textit{nat}), y + (v\Colon\textit{nat}))$'' \\[2\smallskipamount]
 | 
| 
9edc2bd6d2bd
enabled Nitpick's support for quotient types + shortened the Nitpick tests a bit
 blanchet parents: 
35220diff
changeset | 668 | % | 
| 
9edc2bd6d2bd
enabled Nitpick's support for quotient types + shortened the Nitpick tests a bit
 blanchet parents: 
35220diff
changeset | 669 | \textbf{quotient\_definition} ``$\textit{add\/}\Colon\textit{my\_int} \Rightarrow \textit{my\_int} \Rightarrow \textit{my\_int\/}$'' \textbf{is} \textit{add\_raw} \\[2\smallskipamount]
 | 
| 
9edc2bd6d2bd
enabled Nitpick's support for quotient types + shortened the Nitpick tests a bit
 blanchet parents: 
35220diff
changeset | 670 | % | 
| 
9edc2bd6d2bd
enabled Nitpick's support for quotient types + shortened the Nitpick tests a bit
 blanchet parents: 
35220diff
changeset | 671 | \textbf{lemma} ``$\textit{add}~x~y = \textit{add}~x~x$'' \\
 | 
| 
9edc2bd6d2bd
enabled Nitpick's support for quotient types + shortened the Nitpick tests a bit
 blanchet parents: 
35220diff
changeset | 672 | \textbf{nitpick} [\textit{show\_datatypes}] \\[2\smallskipamount]
 | 
| 
9edc2bd6d2bd
enabled Nitpick's support for quotient types + shortened the Nitpick tests a bit
 blanchet parents: 
35220diff
changeset | 673 | \slshape Nitpick found a counterexample: \\[2\smallskipamount] | 
| 
9edc2bd6d2bd
enabled Nitpick's support for quotient types + shortened the Nitpick tests a bit
 blanchet parents: 
35220diff
changeset | 674 | \hbox{}\qquad Free variables: \nopagebreak \\
 | 
| 
9edc2bd6d2bd
enabled Nitpick's support for quotient types + shortened the Nitpick tests a bit
 blanchet parents: 
35220diff
changeset | 675 | \hbox{}\qquad\qquad $x = \Abs{(0,\, 0)}$ \\
 | 
| 
9edc2bd6d2bd
enabled Nitpick's support for quotient types + shortened the Nitpick tests a bit
 blanchet parents: 
35220diff
changeset | 676 | \hbox{}\qquad\qquad $y = \Abs{(1,\, 0)}$ \\
 | 
| 
9edc2bd6d2bd
enabled Nitpick's support for quotient types + shortened the Nitpick tests a bit
 blanchet parents: 
35220diff
changeset | 677 | \hbox{}\qquad Datatypes: \\
 | 
| 
9edc2bd6d2bd
enabled Nitpick's support for quotient types + shortened the Nitpick tests a bit
 blanchet parents: 
35220diff
changeset | 678 | \hbox{}\qquad\qquad $\textit{nat} = \{0,\, 1,\, \unr\}$ \\
 | 
| 35665 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35386diff
changeset | 679 | \hbox{}\qquad\qquad $\textit{nat} \times \textit{nat}~[\textsl{boxed\/}] = \{(0,\, 0),\> (1,\, 0),\> \unr\}$ \\
 | 
| 35284 
9edc2bd6d2bd
enabled Nitpick's support for quotient types + shortened the Nitpick tests a bit
 blanchet parents: 
35220diff
changeset | 680 | \hbox{}\qquad\qquad $\textit{my\_int} = \{\Abs{(0,\, 0)},\> \Abs{(1,\, 0)},\> \unr\}$
 | 
| 
9edc2bd6d2bd
enabled Nitpick's support for quotient types + shortened the Nitpick tests a bit
 blanchet parents: 
35220diff
changeset | 681 | \postw | 
| 
9edc2bd6d2bd
enabled Nitpick's support for quotient types + shortened the Nitpick tests a bit
 blanchet parents: 
35220diff
changeset | 682 | |
| 
9edc2bd6d2bd
enabled Nitpick's support for quotient types + shortened the Nitpick tests a bit
 blanchet parents: 
35220diff
changeset | 683 | In the counterexample, $\Abs{(0,\, 0)}$ and $\Abs{(1,\, 0)}$ represent the
 | 
| 
9edc2bd6d2bd
enabled Nitpick's support for quotient types + shortened the Nitpick tests a bit
 blanchet parents: 
35220diff
changeset | 684 | integers $0$ and $1$, respectively. Other representants would have been | 
| 35712 
77aa29bf14ee
added a mechanism to Nitpick to support custom rendering of terms, and used it for multisets
 blanchet parents: 
35710diff
changeset | 685 | possible---e.g., $\Abs{(5,\, 5)}$ and $\Abs{(12,\, 11)}$. If we are going to
 | 
| 
77aa29bf14ee
added a mechanism to Nitpick to support custom rendering of terms, and used it for multisets
 blanchet parents: 
35710diff
changeset | 686 | use \textit{my\_int} extensively, it pays off to install a term postprocessor
 | 
| 
77aa29bf14ee
added a mechanism to Nitpick to support custom rendering of terms, and used it for multisets
 blanchet parents: 
35710diff
changeset | 687 | that converts the pair notation to the standard mathematical notation: | 
| 
77aa29bf14ee
added a mechanism to Nitpick to support custom rendering of terms, and used it for multisets
 blanchet parents: 
35710diff
changeset | 688 | |
| 
77aa29bf14ee
added a mechanism to Nitpick to support custom rendering of terms, and used it for multisets
 blanchet parents: 
35710diff
changeset | 689 | \prew | 
| 
77aa29bf14ee
added a mechanism to Nitpick to support custom rendering of terms, and used it for multisets
 blanchet parents: 
35710diff
changeset | 690 | $\textbf{ML}~\,\{{*} \\
 | 
| 
77aa29bf14ee
added a mechanism to Nitpick to support custom rendering of terms, and used it for multisets
 blanchet parents: 
35710diff
changeset | 691 | \!\begin{aligned}[t]
 | 
| 
77aa29bf14ee
added a mechanism to Nitpick to support custom rendering of terms, and used it for multisets
 blanchet parents: 
35710diff
changeset | 692 | %& ({*}~\,\textit{Proof.context} \rightarrow \textit{string} \rightarrow (\textit{typ} \rightarrow \textit{term~list\/}) \rightarrow \textit{typ} \rightarrow \textit{term} \\[-2pt]
 | 
| 
77aa29bf14ee
added a mechanism to Nitpick to support custom rendering of terms, and used it for multisets
 blanchet parents: 
35710diff
changeset | 693 | %& \phantom{(*}~\,{\rightarrow}\;\textit{term}~\,{*}) \\[-2pt]
 | 
| 
77aa29bf14ee
added a mechanism to Nitpick to support custom rendering of terms, and used it for multisets
 blanchet parents: 
35710diff
changeset | 694 | & \textbf{fun}\,~\textit{my\_int\_postproc}~\_~\_~\_~T~(\textit{Const}~\_~\$~(\textit{Const}~\_~\$~\textit{t1}~\$~\textit{t2\/})) = {} \\[-2pt]
 | 
| 
77aa29bf14ee
added a mechanism to Nitpick to support custom rendering of terms, and used it for multisets
 blanchet parents: 
35710diff
changeset | 695 | & \phantom{fun}\,~\textit{HOLogic.mk\_number}~T~(\textit{snd}~(\textit{HOLogic.dest\_number~t1}) \\[-2pt]
 | 
| 
77aa29bf14ee
added a mechanism to Nitpick to support custom rendering of terms, and used it for multisets
 blanchet parents: 
35710diff
changeset | 696 | & \phantom{fun\,~\textit{HOLogic.mk\_number}~T~(}{-}~\textit{snd}~(\textit{HOLogic.dest\_number~t2\/})) \\[-2pt]
 | 
| 
77aa29bf14ee
added a mechanism to Nitpick to support custom rendering of terms, and used it for multisets
 blanchet parents: 
35710diff
changeset | 697 | & \phantom{fun}\!{\mid}\,~\textit{my\_int\_postproc}~\_~\_~\_~\_~t = t \\[-2pt]
 | 
| 
77aa29bf14ee
added a mechanism to Nitpick to support custom rendering of terms, and used it for multisets
 blanchet parents: 
35710diff
changeset | 698 | {*}\}\end{aligned}$ \\[2\smallskipamount]
 | 
| 38284 
9f98107ad8b4
use "declaration" instead of "setup" to register Nitpick extensions
 blanchet parents: 
38274diff
changeset | 699 | $\textbf{declaration}~\,\{{*} \\
 | 
| 35712 
77aa29bf14ee
added a mechanism to Nitpick to support custom rendering of terms, and used it for multisets
 blanchet parents: 
35710diff
changeset | 700 | \!\begin{aligned}[t]
 | 
| 38284 
9f98107ad8b4
use "declaration" instead of "setup" to register Nitpick extensions
 blanchet parents: 
38274diff
changeset | 701 | & \textit{Nitpick\_Model.register\_term\_postprocessor}~\!\begin{aligned}[t]
 | 
| 38241 | 702 |   & @\{\textrm{typ}~\textit{my\_int}\} \\[-2pt]
 | 
| 703 |   & \textit{my\_int\_postproc}\end{aligned} \\[-2pt]
 | |
| 35712 
77aa29bf14ee
added a mechanism to Nitpick to support custom rendering of terms, and used it for multisets
 blanchet parents: 
35710diff
changeset | 704 | {*}\}\end{aligned}$
 | 
| 
77aa29bf14ee
added a mechanism to Nitpick to support custom rendering of terms, and used it for multisets
 blanchet parents: 
35710diff
changeset | 705 | \postw | 
| 35284 
9edc2bd6d2bd
enabled Nitpick's support for quotient types + shortened the Nitpick tests a bit
 blanchet parents: 
35220diff
changeset | 706 | |
| 
9edc2bd6d2bd
enabled Nitpick's support for quotient types + shortened the Nitpick tests a bit
 blanchet parents: 
35220diff
changeset | 707 | Records are also handled as datatypes with a single constructor: | 
| 33191 | 708 | |
| 709 | \prew | |
| 710 | \textbf{record} \textit{point} = \\
 | |
| 711 | \hbox{}\quad $\textit{Xcoord} \mathbin{\Colon} \textit{int}$ \\
 | |
| 712 | \hbox{}\quad $\textit{Ycoord} \mathbin{\Colon} \textit{int}$ \\[2\smallskipamount]
 | |
| 713 | \textbf{lemma} ``$\textit{Xcoord}~(p\Colon\textit{point}) = \textit{Xcoord}~(q\Colon\textit{point})$'' \\
 | |
| 714 | \textbf{nitpick} [\textit{show\_datatypes}] \\[2\smallskipamount]
 | |
| 715 | \slshape Nitpick found a counterexample: \\[2\smallskipamount] | |
| 716 | \hbox{}\qquad Free variables: \nopagebreak \\
 | |
| 35078 
6fd1052fe463
optimization to quantifiers in Nitpick's handling of simp rules + renamed some SAT solvers
 blanchet parents: 
35072diff
changeset | 717 | \hbox{}\qquad\qquad $p = \lparr\textit{Xcoord} = 1,\> \textit{Ycoord} = 1\rparr$ \\
 | 
| 
6fd1052fe463
optimization to quantifiers in Nitpick's handling of simp rules + renamed some SAT solvers
 blanchet parents: 
35072diff
changeset | 718 | \hbox{}\qquad\qquad $q = \lparr\textit{Xcoord} = 0,\> \textit{Ycoord} = 0\rparr$ \\
 | 
| 33191 | 719 | \hbox{}\qquad Datatypes: \\
 | 
| 720 | \hbox{}\qquad\qquad $\textit{int} = \{0,\, 1,\, \unr\}$ \\
 | |
| 35078 
6fd1052fe463
optimization to quantifiers in Nitpick's handling of simp rules + renamed some SAT solvers
 blanchet parents: 
35072diff
changeset | 721 | \hbox{}\qquad\qquad $\textit{point} = \{\!\begin{aligned}[t]
 | 
| 
6fd1052fe463
optimization to quantifiers in Nitpick's handling of simp rules + renamed some SAT solvers
 blanchet parents: 
35072diff
changeset | 722 | & \lparr\textit{Xcoord} = 0,\> \textit{Ycoord} = 0\rparr, \\[-2pt] %% TYPESETTING
 | 
| 
6fd1052fe463
optimization to quantifiers in Nitpick's handling of simp rules + renamed some SAT solvers
 blanchet parents: 
35072diff
changeset | 723 | & \lparr\textit{Xcoord} = 1,\> \textit{Ycoord} = 1\rparr,\, \unr\}\end{aligned}$
 | 
| 33191 | 724 | \postw | 
| 725 | ||
| 726 | Finally, Nitpick provides rudimentary support for rationals and reals using a | |
| 727 | similar approach: | |
| 728 | ||
| 729 | \prew | |
| 730 | \textbf{lemma} ``$4 * x + 3 * (y\Colon\textit{real}) \not= 1/2$'' \\
 | |
| 731 | \textbf{nitpick} [\textit{show\_datatypes}] \\[2\smallskipamount]
 | |
| 732 | \slshape Nitpick found a counterexample: \\[2\smallskipamount] | |
| 733 | \hbox{}\qquad Free variables: \nopagebreak \\
 | |
| 734 | \hbox{}\qquad\qquad $x = 1/2$ \\
 | |
| 735 | \hbox{}\qquad\qquad $y = -1/2$ \\
 | |
| 736 | \hbox{}\qquad Datatypes: \\
 | |
| 737 | \hbox{}\qquad\qquad $\textit{nat} = \{0,\, 1,\, 2,\, 3,\, 4,\, 5,\, 6,\, 7,\, \unr\}$ \\
 | |
| 738 | \hbox{}\qquad\qquad $\textit{int} = \{0,\, 1,\, 2,\, 3,\, 4,\, -3,\, -2,\, -1,\, \unr\}$ \\
 | |
| 739 | \hbox{}\qquad\qquad $\textit{real} = \{1,\, 0,\, 4,\, -3/2,\, 3,\, 2,\, 1/2,\, -1/2,\, \unr\}$
 | |
| 740 | \postw | |
| 741 | ||
| 742 | \subsection{Inductive and Coinductive Predicates}
 | |
| 743 | \label{inductive-and-coinductive-predicates}
 | |
| 744 | ||
| 745 | Inductively defined predicates (and sets) are particularly problematic for | |
| 746 | counterexample generators. They can make Quickcheck~\cite{berghofer-nipkow-2004}
 | |
| 747 | loop forever and Refute~\cite{weber-2008} run out of resources. The crux of
 | |
| 38176 | 748 | the problem is that they are defined using a least fixed-point construction. | 
| 33191 | 749 | |
| 750 | Nitpick's philosophy is that not all inductive predicates are equal. Consider | |
| 751 | the \textit{even} predicate below:
 | |
| 752 | ||
| 753 | \prew | |
| 754 | \textbf{inductive}~\textit{even}~\textbf{where} \\
 | |
| 755 | ``\textit{even}~0'' $\,\mid$ \\
 | |
| 756 | ``\textit{even}~$n\,\Longrightarrow\, \textit{even}~(\textit{Suc}~(\textit{Suc}~n))$''
 | |
| 757 | \postw | |
| 758 | ||
| 759 | This predicate enjoys the desirable property of being well-founded, which means | |
| 760 | that the introduction rules don't give rise to infinite chains of the form | |
| 761 | ||
| 762 | \prew | |
| 763 | $\cdots\,\Longrightarrow\, \textit{even}~k''
 | |
| 764 |        \,\Longrightarrow\, \textit{even}~k'
 | |
| 765 |        \,\Longrightarrow\, \textit{even}~k.$
 | |
| 766 | \postw | |
| 767 | ||
| 768 | For \textit{even}, this is obvious: Any chain ending at $k$ will be of length
 | |
| 769 | $k/2 + 1$: | |
| 770 | ||
| 771 | \prew | |
| 772 | $\textit{even}~0\,\Longrightarrow\, \textit{even}~2\,\Longrightarrow\, \cdots
 | |
| 773 |        \,\Longrightarrow\, \textit{even}~(k - 2)
 | |
| 774 |        \,\Longrightarrow\, \textit{even}~k.$
 | |
| 775 | \postw | |
| 776 | ||
| 777 | Wellfoundedness is desirable because it enables Nitpick to use a very efficient | |
| 38176 | 778 | fixed-point computation.% | 
| 33191 | 779 | \footnote{If an inductive predicate is
 | 
| 780 | well-founded, then it has exactly one fixed point, which is simultaneously the | |
| 781 | least and the greatest fixed point. In these circumstances, the computation of | |
| 782 | the least fixed point amounts to the computation of an arbitrary fixed point, | |
| 783 | which can be performed using a straightforward recursive equation.} | |
| 784 | Moreover, Nitpick can prove wellfoundedness of most well-founded predicates, | |
| 785 | just as Isabelle's \textbf{function} package usually discharges termination
 | |
| 786 | proof obligations automatically. | |
| 787 | ||
| 788 | Let's try an example: | |
| 789 | ||
| 790 | \prew | |
| 791 | \textbf{lemma} ``$\exists n.\; \textit{even}~n \mathrel{\land} \textit{even}~(\textit{Suc}~n)$'' \\
 | |
| 35712 
77aa29bf14ee
added a mechanism to Nitpick to support custom rendering of terms, and used it for multisets
 blanchet parents: 
35710diff
changeset | 792 | \textbf{nitpick}~[\textit{card nat}~= 50, \textit{unary\_ints}, \textit{verbose}] \\[2\smallskipamount]
 | 
| 33191 | 793 | \slshape The inductive predicate ``\textit{even}'' was proved well-founded.
 | 
| 794 | Nitpick can compute it efficiently. \\[2\smallskipamount] | |
| 795 | Trying 1 scope: \\ | |
| 35712 
77aa29bf14ee
added a mechanism to Nitpick to support custom rendering of terms, and used it for multisets
 blanchet parents: 
35710diff
changeset | 796 | \hbox{}\qquad \textit{card nat}~= 50. \\[2\smallskipamount]
 | 
| 
77aa29bf14ee
added a mechanism to Nitpick to support custom rendering of terms, and used it for multisets
 blanchet parents: 
35710diff
changeset | 797 | Nitpick found a potential counterexample for \textit{card nat}~= 50: \\[2\smallskipamount]
 | 
| 33191 | 798 | \hbox{}\qquad Empty assignment \\[2\smallskipamount]
 | 
| 38183 | 799 | Nitpick could not find a better counterexample. It checked 0 of 1 scope. \\[2\smallskipamount] | 
| 800 | Total time: 1439 ms. | |
| 33191 | 801 | \postw | 
| 802 | ||
| 803 | No genuine counterexample is possible because Nitpick cannot rule out the | |
| 35712 
77aa29bf14ee
added a mechanism to Nitpick to support custom rendering of terms, and used it for multisets
 blanchet parents: 
35710diff
changeset | 804 | existence of a natural number $n \ge 50$ such that both $\textit{even}~n$ and
 | 
| 33191 | 805 | $\textit{even}~(\textit{Suc}~n)$ are true. To help Nitpick, we can bound the
 | 
| 806 | existential quantifier: | |
| 807 | ||
| 808 | \prew | |
| 35712 
77aa29bf14ee
added a mechanism to Nitpick to support custom rendering of terms, and used it for multisets
 blanchet parents: 
35710diff
changeset | 809 | \textbf{lemma} ``$\exists n \mathbin{\le} 49.\; \textit{even}~n \mathrel{\land} \textit{even}~(\textit{Suc}~n)$'' \\
 | 
| 
77aa29bf14ee
added a mechanism to Nitpick to support custom rendering of terms, and used it for multisets
 blanchet parents: 
35710diff
changeset | 810 | \textbf{nitpick}~[\textit{card nat}~= 50, \textit{unary\_ints}] \\[2\smallskipamount]
 | 
| 33191 | 811 | \slshape Nitpick found a counterexample: \\[2\smallskipamount] | 
| 812 | \hbox{}\qquad Empty assignment
 | |
| 813 | \postw | |
| 814 | ||
| 815 | So far we were blessed by the wellfoundedness of \textit{even}. What happens if
 | |
| 816 | we use the following definition instead? | |
| 817 | ||
| 818 | \prew | |
| 819 | \textbf{inductive} $\textit{even}'$ \textbf{where} \\
 | |
| 820 | ``$\textit{even}'~(0{\Colon}\textit{nat})$'' $\,\mid$ \\
 | |
| 821 | ``$\textit{even}'~2$'' $\,\mid$ \\
 | |
| 822 | ``$\lbrakk\textit{even}'~m;\> \textit{even}'~n\rbrakk \,\Longrightarrow\, \textit{even}'~(m + n)$''
 | |
| 823 | \postw | |
| 824 | ||
| 825 | This definition is not well-founded: From $\textit{even}'~0$ and
 | |
| 826 | $\textit{even}'~0$, we can derive that $\textit{even}'~0$. Nonetheless, the
 | |
| 827 | predicates $\textit{even}$ and $\textit{even}'$ are equivalent.
 | |
| 828 | ||
| 829 | Let's check a property involving $\textit{even}'$. To make up for the
 | |
| 830 | foreseeable computational hurdles entailed by non-wellfoundedness, we decrease | |
| 831 | \textit{nat}'s cardinality to a mere 10:
 | |
| 832 | ||
| 833 | \prew | |
| 834 | \textbf{lemma}~``$\exists n \in \{0, 2, 4, 6, 8\}.\;
 | |
| 835 | \lnot\;\textit{even}'~n$'' \\
 | |
| 836 | \textbf{nitpick}~[\textit{card nat}~= 10,\, \textit{verbose},\, \textit{show\_consts}] \\[2\smallskipamount]
 | |
| 837 | \slshape | |
| 838 | The inductive predicate ``$\textit{even}'\!$'' could not be proved well-founded.
 | |
| 839 | Nitpick might need to unroll it. \\[2\smallskipamount] | |
| 840 | Trying 6 scopes: \\ | |
| 841 | \hbox{}\qquad \textit{card nat}~= 10 and \textit{iter} $\textit{even}'$~= 0; \\
 | |
| 842 | \hbox{}\qquad \textit{card nat}~= 10 and \textit{iter} $\textit{even}'$~= 1; \\
 | |
| 843 | \hbox{}\qquad \textit{card nat}~= 10 and \textit{iter} $\textit{even}'$~= 2; \\
 | |
| 844 | \hbox{}\qquad \textit{card nat}~= 10 and \textit{iter} $\textit{even}'$~= 4; \\
 | |
| 845 | \hbox{}\qquad \textit{card nat}~= 10 and \textit{iter} $\textit{even}'$~= 8; \\
 | |
| 846 | \hbox{}\qquad \textit{card nat}~= 10 and \textit{iter} $\textit{even}'$~= 9. \\[2\smallskipamount]
 | |
| 847 | Nitpick found a counterexample for \textit{card nat}~= 10 and \textit{iter} $\textit{even}'$~= 2: \\[2\smallskipamount]
 | |
| 848 | \hbox{}\qquad Constant: \nopagebreak \\
 | |
| 849 | \hbox{}\qquad\qquad $\lambda i.\; \textit{even}'$ = $\undef(\!\begin{aligned}[t]
 | |
| 850 | & 2 := \{0, 2, 4, 6, 8, 1^\Q, 3^\Q, 5^\Q, 7^\Q, 9^\Q\}, \\[-2pt]
 | |
| 851 | & 1 := \{0, 2, 4, 1^\Q, 3^\Q, 5^\Q, 6^\Q, 7^\Q, 8^\Q, 9^\Q\}, \\[-2pt]
 | |
| 852 | & 0 := \{0, 2, 1^\Q, 3^\Q, 4^\Q, 5^\Q, 6^\Q, 7^\Q, 8^\Q, 9^\Q\})\end{aligned}$ \\[2\smallskipamount]
 | |
| 38183 | 853 | Total time: 2420 ms. | 
| 33191 | 854 | \postw | 
| 855 | ||
| 856 | Nitpick's output is very instructive. First, it tells us that the predicate is | |
| 857 | unrolled, meaning that it is computed iteratively from the empty set. Then it | |
| 858 | lists six scopes specifying different bounds on the numbers of iterations:\ 0, | |
| 859 | 1, 2, 4, 8, and~9. | |
| 860 | ||
| 861 | The output also shows how each iteration contributes to $\textit{even}'$. The
 | |
| 862 | notation $\lambda i.\; \textit{even}'$ indicates that the value of the
 | |
| 863 | predicate depends on an iteration counter. Iteration 0 provides the basis | |
| 864 | elements, $0$ and $2$. Iteration 1 contributes $4$ ($= 2 + 2$). Iteration 2 | |
| 865 | throws $6$ ($= 2 + 4 = 4 + 2$) and $8$ ($= 4 + 4$) into the mix. Further | |
| 866 | iterations would not contribute any new elements. | |
| 867 | ||
| 868 | Some values are marked with superscripted question | |
| 869 | marks~(`\lower.2ex\hbox{$^\Q$}'). These are the elements for which the
 | |
| 870 | predicate evaluates to $\unk$. Thus, $\textit{even}'$ evaluates to either
 | |
| 871 | \textit{True} or $\unk$, never \textit{False}.
 | |
| 872 | ||
| 38181 | 873 | When unrolling a predicate, Nitpick tries 0, 1, 2, 4, 8, 12, 16, 20, 24, and 28 | 
| 33191 | 874 | iterations. However, these numbers are bounded by the cardinality of the | 
| 875 | predicate's domain. With \textit{card~nat}~= 10, no more than 9 iterations are
 | |
| 876 | ever needed to compute the value of a \textit{nat} predicate. You can specify
 | |
| 877 | the number of iterations using the \textit{iter} option, as explained in
 | |
| 878 | \S\ref{scope-of-search}.
 | |
| 879 | ||
| 880 | In the next formula, $\textit{even}'$ occurs both positively and negatively:
 | |
| 881 | ||
| 882 | \prew | |
| 883 | \textbf{lemma} ``$\textit{even}'~(n - 2) \,\Longrightarrow\, \textit{even}'~n$'' \\
 | |
| 34124 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 884 | \textbf{nitpick} [\textit{card nat} = 10, \textit{show\_consts}] \\[2\smallskipamount]
 | 
| 33191 | 885 | \slshape Nitpick found a counterexample: \\[2\smallskipamount] | 
| 886 | \hbox{}\qquad Free variable: \nopagebreak \\
 | |
| 887 | \hbox{}\qquad\qquad $n = 1$ \\
 | |
| 888 | \hbox{}\qquad Constants: \nopagebreak \\
 | |
| 889 | \hbox{}\qquad\qquad $\lambda i.\; \textit{even}'$ = $\undef(\!\begin{aligned}[t]
 | |
| 890 | & 0 := \{0, 2, 1^\Q, 3^\Q, 4^\Q, 5^\Q, 6^\Q, 7^\Q, 8^\Q, 9^\Q\})\end{aligned}$  \\
 | |
| 891 | \hbox{}\qquad\qquad $\textit{even}' \subseteq \{0, 2, 4, 6, 8, \unr\}$
 | |
| 892 | \postw | |
| 893 | ||
| 894 | Notice the special constraint $\textit{even}' \subseteq \{0,\, 2,\, 4,\, 6,\,
 | |
| 895 | 8,\, \unr\}$ in the output, whose right-hand side represents an arbitrary | |
| 896 | fixed point (not necessarily the least one). It is used to falsify | |
| 897 | $\textit{even}'~n$. In contrast, the unrolled predicate is used to satisfy
 | |
| 898 | $\textit{even}'~(n - 2)$.
 | |
| 899 | ||
| 900 | Coinductive predicates are handled dually. For example: | |
| 901 | ||
| 902 | \prew | |
| 903 | \textbf{coinductive} \textit{nats} \textbf{where} \\
 | |
| 904 | ``$\textit{nats}~(x\Colon\textit{nat}) \,\Longrightarrow\, \textit{nats}~x$'' \\[2\smallskipamount]
 | |
| 905 | \textbf{lemma} ``$\textit{nats} = \{0, 1, 2, 3, 4\}$'' \\
 | |
| 906 | \textbf{nitpick}~[\textit{card nat} = 10,\, \textit{show\_consts}] \\[2\smallskipamount]
 | |
| 907 | \slshape Nitpick found a counterexample: | |
| 908 | \\[2\smallskipamount] | |
| 909 | \hbox{}\qquad Constants: \nopagebreak \\
 | |
| 910 | \hbox{}\qquad\qquad $\lambda i.\; \textit{nats} = \undef(0 := \{\!\begin{aligned}[t]
 | |
| 911 | & 0^\Q, 1^\Q, 2^\Q, 3^\Q, 4^\Q, 5^\Q, 6^\Q, 7^\Q, 8^\Q, 9^\Q, \\[-2pt] | |
| 912 | & \unr\})\end{aligned}$ \\
 | |
| 913 | \hbox{}\qquad\qquad $nats \supseteq \{9, 5^\Q, 6^\Q, 7^\Q, 8^\Q, \unr\}$
 | |
| 914 | \postw | |
| 915 | ||
| 916 | As a special case, Nitpick uses Kodkod's transitive closure operator to encode | |
| 917 | negative occurrences of non-well-founded ``linear inductive predicates,'' i.e., | |
| 918 | inductive predicates for which each the predicate occurs in at most one | |
| 919 | assumption of each introduction rule. For example: | |
| 920 | ||
| 921 | \prew | |
| 922 | \textbf{inductive} \textit{odd} \textbf{where} \\
 | |
| 923 | ``$\textit{odd}~1$'' $\,\mid$ \\
 | |
| 924 | ``$\lbrakk \textit{odd}~m;\>\, \textit{even}~n\rbrakk \,\Longrightarrow\, \textit{odd}~(m + n)$'' \\[2\smallskipamount]
 | |
| 925 | \textbf{lemma}~``$\textit{odd}~n \,\Longrightarrow\, \textit{odd}~(n - 2)$'' \\
 | |
| 926 | \textbf{nitpick}~[\textit{card nat} = 10,\, \textit{show\_consts}] \\[2\smallskipamount]
 | |
| 927 | \slshape Nitpick found a counterexample: | |
| 928 | \\[2\smallskipamount] | |
| 929 | \hbox{}\qquad Free variable: \nopagebreak \\
 | |
| 930 | \hbox{}\qquad\qquad $n = 1$ \\
 | |
| 931 | \hbox{}\qquad Constants: \nopagebreak \\
 | |
| 932 | \hbox{}\qquad\qquad $\textit{even} = \{0, 2, 4, 6, 8, \unr\}$ \\
 | |
| 933 | \hbox{}\qquad\qquad $\textit{odd}_{\textsl{base}} = \{1, \unr\}$ \\
 | |
| 934 | \hbox{}\qquad\qquad $\textit{odd}_{\textsl{step}} = \!
 | |
| 935 | \!\begin{aligned}[t]
 | |
| 936 |   & \{(0, 0), (0, 2), (0, 4), (0, 6), (0, 8), (1, 1), (1, 3), (1, 5), \\[-2pt]
 | |
| 937 |   & \phantom{\{} (1, 7), (1, 9), (2, 2), (2, 4), (2, 6), (2, 8), (3, 3),
 | |
| 938 | (3, 5), \\[-2pt] | |
| 939 |   & \phantom{\{} (3, 7), (3, 9), (4, 4), (4, 6), (4, 8), (5, 5), (5, 7), (5, 9), \\[-2pt]
 | |
| 940 |   & \phantom{\{} (6, 6), (6, 8), (7, 7), (7, 9), (8, 8), (9, 9), \unr\}\end{aligned}$ \\
 | |
| 941 | \hbox{}\qquad\qquad $\textit{odd} \subseteq \{1, 3, 5, 7, 9, 8^\Q, \unr\}$
 | |
| 942 | \postw | |
| 943 | ||
| 944 | \noindent | |
| 945 | In the output, $\textit{odd}_{\textrm{base}}$ represents the base elements and
 | |
| 946 | $\textit{odd}_{\textrm{step}}$ is a transition relation that computes new
 | |
| 947 | elements from known ones. The set $\textit{odd}$ consists of all the values
 | |
| 948 | reachable through the reflexive transitive closure of | |
| 949 | $\textit{odd}_{\textrm{step}}$ starting with any element from
 | |
| 950 | $\textit{odd}_{\textrm{base}}$, namely 1, 3, 5, 7, and 9. Using Kodkod's
 | |
| 951 | transitive closure to encode linear predicates is normally either more thorough | |
| 952 | or more efficient than unrolling (depending on the value of \textit{iter}), but
 | |
| 953 | for those cases where it isn't you can disable it by passing the | |
| 954 | \textit{dont\_star\_linear\_preds} option.
 | |
| 955 | ||
| 956 | \subsection{Coinductive Datatypes}
 | |
| 957 | \label{coinductive-datatypes}
 | |
| 958 | ||
| 959 | While Isabelle regrettably lacks a high-level mechanism for defining coinductive | |
| 35665 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35386diff
changeset | 960 | datatypes, the \textit{Coinductive\_List} theory from Andreas Lochbihler's
 | 
| 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35386diff
changeset | 961 | \textit{Coinductive} AFP entry \cite{lochbihler-2010} provides a coinductive
 | 
| 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35386diff
changeset | 962 | ``lazy list'' datatype, $'a~\textit{llist}$, defined the hard way. Nitpick
 | 
| 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35386diff
changeset | 963 | supports these lazy lists seamlessly and provides a hook, described in | 
| 33191 | 964 | \S\ref{registration-of-coinductive-datatypes}, to register custom coinductive
 | 
| 965 | datatypes. | |
| 966 | ||
| 967 | (Co)intuitively, a coinductive datatype is similar to an inductive datatype but | |
| 968 | allows infinite objects. Thus, the infinite lists $\textit{ps}$ $=$ $[a, a, a,
 | |
| 969 | \ldots]$, $\textit{qs}$ $=$ $[a, b, a, b, \ldots]$, and $\textit{rs}$ $=$ $[0,
 | |
| 970 | 1, 2, 3, \ldots]$ can be defined as lazy lists using the | |
| 971 | $\textit{LNil}\mathbin{\Colon}{'}a~\textit{llist}$ and
 | |
| 972 | $\textit{LCons}\mathbin{\Colon}{'}a \mathbin{\Rightarrow} {'}a~\textit{llist}
 | |
| 973 | \mathbin{\Rightarrow} {'}a~\textit{llist}$ constructors.
 | |
| 974 | ||
| 975 | Although it is otherwise no friend of infinity, Nitpick can find counterexamples | |
| 976 | involving cyclic lists such as \textit{ps} and \textit{qs} above as well as
 | |
| 977 | finite lists: | |
| 978 | ||
| 979 | \prew | |
| 980 | \textbf{lemma} ``$\textit{xs} \not= \textit{LCons}~a~\textit{xs}$'' \\
 | |
| 981 | \textbf{nitpick} \\[2\smallskipamount]
 | |
| 982 | \slshape Nitpick found a counterexample for {\itshape card}~$'a$ = 1: \\[2\smallskipamount]
 | |
| 983 | \hbox{}\qquad Free variables: \nopagebreak \\
 | |
| 984 | \hbox{}\qquad\qquad $\textit{a} = a_1$ \\
 | |
| 985 | \hbox{}\qquad\qquad $\textit{xs} = \textsl{THE}~\omega.\; \omega = \textit{LCons}~a_1~\omega$
 | |
| 986 | \postw | |
| 987 | ||
| 988 | The notation $\textrm{THE}~\omega.\; \omega = t(\omega)$ stands
 | |
| 989 | for the infinite term $t(t(t(\ldots)))$. Hence, \textit{xs} is simply the
 | |
| 990 | infinite list $[a_1, a_1, a_1, \ldots]$. | |
| 991 | ||
| 992 | The next example is more interesting: | |
| 993 | ||
| 994 | \prew | |
| 995 | \textbf{lemma}~``$\lbrakk\textit{xs} = \textit{LCons}~a~\textit{xs};\>\,
 | |
| 996 | \textit{ys} = \textit{iterates}~(\lambda b.\> a)~b\rbrakk \,\Longrightarrow\, \textit{xs} = \textit{ys}$'' \\
 | |
| 997 | \textbf{nitpick} [\textit{verbose}] \\[2\smallskipamount]
 | |
| 998 | \slshape The type ``\kern1pt$'a$'' passed the monotonicity test. Nitpick might be able to skip | |
| 999 | some scopes. \\[2\smallskipamount] | |
| 38181 | 1000 | Trying 10 scopes: \\ | 
| 35284 
9edc2bd6d2bd
enabled Nitpick's support for quotient types + shortened the Nitpick tests a bit
 blanchet parents: 
35220diff
changeset | 1001 | \hbox{}\qquad \textit{card} $'a$~= 1, \textit{card} ``\kern1pt$'a~\textit{list\/}$''~= 1,
 | 
| 33191 | 1002 | and \textit{bisim\_depth}~= 0. \\
 | 
| 1003 | \hbox{}\qquad $\qquad\vdots$ \\[.5\smallskipamount]
 | |
| 38181 | 1004 | \hbox{}\qquad \textit{card} $'a$~= 10, \textit{card} ``\kern1pt$'a~\textit{list\/}$''~= 10,
 | 
| 1005 | and \textit{bisim\_depth}~= 9. \\[2\smallskipamount]
 | |
| 33191 | 1006 | Nitpick found a counterexample for {\itshape card}~$'a$ = 2,
 | 
| 35284 
9edc2bd6d2bd
enabled Nitpick's support for quotient types + shortened the Nitpick tests a bit
 blanchet parents: 
35220diff
changeset | 1007 | \textit{card}~``\kern1pt$'a~\textit{list\/}$''~= 2, and \textit{bisim\_\allowbreak
 | 
| 33191 | 1008 | depth}~= 1: | 
| 1009 | \\[2\smallskipamount] | |
| 1010 | \hbox{}\qquad Free variables: \nopagebreak \\
 | |
| 35078 
6fd1052fe463
optimization to quantifiers in Nitpick's handling of simp rules + renamed some SAT solvers
 blanchet parents: 
35072diff
changeset | 1011 | \hbox{}\qquad\qquad $\textit{a} = a_1$ \\
 | 
| 
6fd1052fe463
optimization to quantifiers in Nitpick's handling of simp rules + renamed some SAT solvers
 blanchet parents: 
35072diff
changeset | 1012 | \hbox{}\qquad\qquad $\textit{b} = a_2$ \\
 | 
| 
6fd1052fe463
optimization to quantifiers in Nitpick's handling of simp rules + renamed some SAT solvers
 blanchet parents: 
35072diff
changeset | 1013 | \hbox{}\qquad\qquad $\textit{xs} = \textsl{THE}~\omega.\; \omega = \textit{LCons}~a_1~\omega$ \\
 | 
| 
6fd1052fe463
optimization to quantifiers in Nitpick's handling of simp rules + renamed some SAT solvers
 blanchet parents: 
35072diff
changeset | 1014 | \hbox{}\qquad\qquad $\textit{ys} = \textit{LCons}~a_2~(\textsl{THE}~\omega.\; \omega = \textit{LCons}~a_1~\omega)$ \\[2\smallskipamount]
 | 
| 38183 | 1015 | Total time: 1027 ms. | 
| 33191 | 1016 | \postw | 
| 1017 | ||
| 35078 
6fd1052fe463
optimization to quantifiers in Nitpick's handling of simp rules + renamed some SAT solvers
 blanchet parents: 
35072diff
changeset | 1018 | The lazy list $\textit{xs}$ is simply $[a_1, a_1, a_1, \ldots]$, whereas
 | 
| 
6fd1052fe463
optimization to quantifiers in Nitpick's handling of simp rules + renamed some SAT solvers
 blanchet parents: 
35072diff
changeset | 1019 | $\textit{ys}$ is $[a_2, a_1, a_1, a_1, \ldots]$, i.e., a lasso-shaped list with
 | 
| 
6fd1052fe463
optimization to quantifiers in Nitpick's handling of simp rules + renamed some SAT solvers
 blanchet parents: 
35072diff
changeset | 1020 | $[a_2]$ as its stem and $[a_1]$ as its cycle. In general, the list segment | 
| 33191 | 1021 | within the scope of the {THE} binder corresponds to the lasso's cycle, whereas
 | 
| 1022 | the segment leading to the binder is the stem. | |
| 1023 | ||
| 1024 | A salient property of coinductive datatypes is that two objects are considered | |
| 1025 | equal if and only if they lead to the same observations. For example, the lazy | |
| 1026 | lists $\textrm{THE}~\omega.\; \omega =
 | |
| 1027 | \textit{LCons}~a~(\textit{LCons}~b~\omega)$ and
 | |
| 1028 | $\textit{LCons}~a~(\textrm{THE}~\omega.\; \omega =
 | |
| 1029 | \textit{LCons}~b~(\textit{LCons}~a~\omega))$ are identical, because both lead
 | |
| 1030 | to the sequence of observations $a$, $b$, $a$, $b$, \hbox{\ldots} (or,
 | |
| 1031 | equivalently, both encode the infinite list $[a, b, a, b, \ldots]$). This | |
| 1032 | concept of equality for coinductive datatypes is called bisimulation and is | |
| 1033 | defined coinductively. | |
| 1034 | ||
| 1035 | Internally, Nitpick encodes the coinductive bisimilarity predicate as part of | |
| 1036 | the Kodkod problem to ensure that distinct objects lead to different | |
| 1037 | observations. This precaution is somewhat expensive and often unnecessary, so it | |
| 1038 | can be disabled by setting the \textit{bisim\_depth} option to $-1$. The
 | |
| 1039 | bisimilarity check is then performed \textsl{after} the counterexample has been
 | |
| 1040 | found to ensure correctness. If this after-the-fact check fails, the | |
| 35695 | 1041 | counterexample is tagged as ``quasi genuine'' and Nitpick recommends to try | 
| 33191 | 1042 | again with \textit{bisim\_depth} set to a nonnegative integer. Disabling the
 | 
| 1043 | check for the previous example saves approximately 150~milli\-seconds; the speed | |
| 1044 | gains can be more significant for larger scopes. | |
| 1045 | ||
| 1046 | The next formula illustrates the need for bisimilarity (either as a Kodkod | |
| 1047 | predicate or as an after-the-fact check) to prevent spurious counterexamples: | |
| 1048 | ||
| 1049 | \prew | |
| 1050 | \textbf{lemma} ``$\lbrakk xs = \textit{LCons}~a~\textit{xs};\>\, \textit{ys} = \textit{LCons}~a~\textit{ys}\rbrakk
 | |
| 1051 | \,\Longrightarrow\, \textit{xs} = \textit{ys}$'' \\
 | |
| 34124 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 1052 | \textbf{nitpick} [\textit{bisim\_depth} = $-1$, \textit{show\_datatypes}] \\[2\smallskipamount]
 | 
| 35695 | 1053 | \slshape Nitpick found a quasi genuine counterexample for $\textit{card}~'a$ = 2: \\[2\smallskipamount]
 | 
| 33191 | 1054 | \hbox{}\qquad Free variables: \nopagebreak \\
 | 
| 35078 
6fd1052fe463
optimization to quantifiers in Nitpick's handling of simp rules + renamed some SAT solvers
 blanchet parents: 
35072diff
changeset | 1055 | \hbox{}\qquad\qquad $a = a_1$ \\
 | 
| 33191 | 1056 | \hbox{}\qquad\qquad $\textit{xs} = \textsl{THE}~\omega.\; \omega =
 | 
| 35078 
6fd1052fe463
optimization to quantifiers in Nitpick's handling of simp rules + renamed some SAT solvers
 blanchet parents: 
35072diff
changeset | 1057 | \textit{LCons}~a_1~\omega$ \\
 | 
| 
6fd1052fe463
optimization to quantifiers in Nitpick's handling of simp rules + renamed some SAT solvers
 blanchet parents: 
35072diff
changeset | 1058 | \hbox{}\qquad\qquad $\textit{ys} = \textsl{THE}~\omega.\; \omega = \textit{LCons}~a_1~\omega$ \\
 | 
| 33191 | 1059 | \hbox{}\qquad Codatatype:\strut \nopagebreak \\
 | 
| 1060 | \hbox{}\qquad\qquad $'a~\textit{llist} =
 | |
| 1061 | \{\!\begin{aligned}[t]
 | |
| 35078 
6fd1052fe463
optimization to quantifiers in Nitpick's handling of simp rules + renamed some SAT solvers
 blanchet parents: 
35072diff
changeset | 1062 |   & \textsl{THE}~\omega.\; \omega = \textit{LCons}~a_1~\omega, \\[-2pt]
 | 
| 
6fd1052fe463
optimization to quantifiers in Nitpick's handling of simp rules + renamed some SAT solvers
 blanchet parents: 
35072diff
changeset | 1063 |   & \textsl{THE}~\omega.\; \omega = \textit{LCons}~a_1~\omega,\> \unr\}\end{aligned}$
 | 
| 33191 | 1064 | \\[2\smallskipamount] | 
| 1065 | Try again with ``\textit{bisim\_depth}'' set to a nonnegative value to confirm
 | |
| 1066 | that the counterexample is genuine. \\[2\smallskipamount] | |
| 1067 | {\upshape\textbf{nitpick}} \\[2\smallskipamount]
 | |
| 1068 | \slshape Nitpick found no counterexample. | |
| 1069 | \postw | |
| 1070 | ||
| 1071 | In the first \textbf{nitpick} invocation, the after-the-fact check discovered 
 | |
| 1072 | that the two known elements of type $'a~\textit{llist}$ are bisimilar.
 | |
| 1073 | ||
| 1074 | A compromise between leaving out the bisimilarity predicate from the Kodkod | |
| 1075 | problem and performing the after-the-fact check is to specify a lower | |
| 1076 | nonnegative \textit{bisim\_depth} value than the default one provided by
 | |
| 1077 | Nitpick. In general, a value of $K$ means that Nitpick will require all lists to | |
| 1078 | be distinguished from each other by their prefixes of length $K$. Be aware that | |
| 1079 | setting $K$ to a too low value can overconstrain Nitpick, preventing it from | |
| 1080 | finding any counterexamples. | |
| 1081 | ||
| 1082 | \subsection{Boxing}
 | |
| 1083 | \label{boxing}
 | |
| 1084 | ||
| 1085 | Nitpick normally maps function and product types directly to the corresponding | |
| 1086 | Kodkod concepts. As a consequence, if $'a$ has cardinality 3 and $'b$ has | |
| 1087 | cardinality 4, then $'a \times {'}b$ has cardinality 12 ($= 4 \times 3$) and $'a
 | |
| 1088 | \Rightarrow {'}b$ has cardinality 64 ($= 4^3$). In some circumstances, it pays
 | |
| 1089 | off to treat these types in the same way as plain datatypes, by approximating | |
| 1090 | them by a subset of a given cardinality. This technique is called ``boxing'' and | |
| 1091 | is particularly useful for functions passed as arguments to other functions, for | |
| 1092 | high-arity functions, and for large tuples. Under the hood, boxing involves | |
| 1093 | wrapping occurrences of the types $'a \times {'}b$ and $'a \Rightarrow {'}b$ in
 | |
| 1094 | isomorphic datatypes, as can be seen by enabling the \textit{debug} option.
 | |
| 1095 | ||
| 1096 | To illustrate boxing, we consider a formalization of $\lambda$-terms represented | |
| 1097 | using de Bruijn's notation: | |
| 1098 | ||
| 1099 | \prew | |
| 1100 | \textbf{datatype} \textit{tm} = \textit{Var}~\textit{nat}~$\mid$~\textit{Lam}~\textit{tm} $\mid$ \textit{App~tm~tm}
 | |
| 1101 | \postw | |
| 1102 | ||
| 1103 | The $\textit{lift}~t~k$ function increments all variables with indices greater
 | |
| 1104 | than or equal to $k$ by one: | |
| 1105 | ||
| 1106 | \prew | |
| 1107 | \textbf{primrec} \textit{lift} \textbf{where} \\
 | |
| 1108 | ``$\textit{lift}~(\textit{Var}~j)~k = \textit{Var}~(\textrm{if}~j < k~\textrm{then}~j~\textrm{else}~j + 1)$'' $\mid$ \\
 | |
| 1109 | ``$\textit{lift}~(\textit{Lam}~t)~k = \textit{Lam}~(\textit{lift}~t~(k + 1))$'' $\mid$ \\
 | |
| 1110 | ``$\textit{lift}~(\textit{App}~t~u)~k = \textit{App}~(\textit{lift}~t~k)~(\textit{lift}~u~k)$''
 | |
| 1111 | \postw | |
| 1112 | ||
| 1113 | The $\textit{loose}~t~k$ predicate returns \textit{True} if and only if
 | |
| 1114 | term $t$ has a loose variable with index $k$ or more: | |
| 1115 | ||
| 1116 | \prew | |
| 1117 | \textbf{primrec}~\textit{loose} \textbf{where} \\
 | |
| 1118 | ``$\textit{loose}~(\textit{Var}~j)~k = (j \ge k)$'' $\mid$ \\
 | |
| 1119 | ``$\textit{loose}~(\textit{Lam}~t)~k = \textit{loose}~t~(\textit{Suc}~k)$'' $\mid$ \\
 | |
| 1120 | ``$\textit{loose}~(\textit{App}~t~u)~k = (\textit{loose}~t~k \mathrel{\lor} \textit{loose}~u~k)$''
 | |
| 1121 | \postw | |
| 1122 | ||
| 1123 | Next, the $\textit{subst}~\sigma~t$ function applies the substitution $\sigma$
 | |
| 1124 | on $t$: | |
| 1125 | ||
| 1126 | \prew | |
| 1127 | \textbf{primrec}~\textit{subst} \textbf{where} \\
 | |
| 1128 | ``$\textit{subst}~\sigma~(\textit{Var}~j) = \sigma~j$'' $\mid$ \\
 | |
| 1129 | ``$\textit{subst}~\sigma~(\textit{Lam}~t) = {}$\phantom{''} \\
 | |
| 1130 | \phantom{``}$\textit{Lam}~(\textit{subst}~(\lambda n.\> \textrm{case}~n~\textrm{of}~0 \Rightarrow \textit{Var}~0 \mid \textit{Suc}~m \Rightarrow \textit{lift}~(\sigma~m)~1)~t)$'' $\mid$ \\
 | |
| 1131 | ``$\textit{subst}~\sigma~(\textit{App}~t~u) = \textit{App}~(\textit{subst}~\sigma~t)~(\textit{subst}~\sigma~u)$''
 | |
| 1132 | \postw | |
| 1133 | ||
| 1134 | A substitution is a function that maps variable indices to terms. Observe that | |
| 1135 | $\sigma$ is a function passed as argument and that Nitpick can't optimize it | |
| 1136 | away, because the recursive call for the \textit{Lam} case involves an altered
 | |
| 1137 | version. Also notice the \textit{lift} call, which increments the variable
 | |
| 1138 | indices when moving under a \textit{Lam}.
 | |
| 1139 | ||
| 1140 | A reasonable property to expect of substitution is that it should leave closed | |
| 1141 | terms unchanged. Alas, even this simple property does not hold: | |
| 1142 | ||
| 1143 | \pre | |
| 1144 | \textbf{lemma}~``$\lnot\,\textit{loose}~t~0 \,\Longrightarrow\, \textit{subst}~\sigma~t = t$'' \\
 | |
| 1145 | \textbf{nitpick} [\textit{verbose}] \\[2\smallskipamount]
 | |
| 1146 | \slshape | |
| 38181 | 1147 | Trying 10 scopes: \nopagebreak \\ | 
| 33191 | 1148 | \hbox{}\qquad \textit{card~nat}~= 1, \textit{card tm}~= 1, and \textit{card} ``$\textit{nat} \Rightarrow \textit{tm}$'' = 1; \\
 | 
| 1149 | \hbox{}\qquad \textit{card~nat}~= 2, \textit{card tm}~= 2, and \textit{card} ``$\textit{nat} \Rightarrow \textit{tm}$'' = 2; \\
 | |
| 1150 | \hbox{}\qquad $\qquad\vdots$ \\[.5\smallskipamount]
 | |
| 38181 | 1151 | \hbox{}\qquad \textit{card~nat}~= 10, \textit{card tm}~= 10, and \textit{card} ``$\textit{nat} \Rightarrow \textit{tm}$'' = 10. \\[2\smallskipamount]
 | 
| 33191 | 1152 | Nitpick found a counterexample for \textit{card~nat}~= 6, \textit{card~tm}~= 6,
 | 
| 1153 | and \textit{card}~``$\textit{nat} \Rightarrow \textit{tm}$''~= 6: \\[2\smallskipamount]
 | |
| 1154 | \hbox{}\qquad Free variables: \nopagebreak \\
 | |
| 1155 | \hbox{}\qquad\qquad $\sigma = \undef(\!\begin{aligned}[t]
 | |
| 1156 | & 0 := \textit{Var}~0,\>
 | |
| 1157 |   1 := \textit{Var}~0,\>
 | |
| 1158 |   2 := \textit{Var}~0, \\[-2pt]
 | |
| 1159 | & 3 := \textit{Var}~0,\>
 | |
| 1160 |   4 := \textit{Var}~0,\>
 | |
| 1161 |   5 := \textit{Var}~0)\end{aligned}$ \\
 | |
| 1162 | \hbox{}\qquad\qquad $t = \textit{Lam}~(\textit{Lam}~(\textit{Var}~1))$ \\[2\smallskipamount]
 | |
| 38183 | 1163 | Total time: $3560$ ms. | 
| 33191 | 1164 | \postw | 
| 1165 | ||
| 1166 | Using \textit{eval}, we find out that $\textit{subst}~\sigma~t =
 | |
| 1167 | \textit{Lam}~(\textit{Lam}~(\textit{Var}~0))$. Using the traditional
 | |
| 1168 | $\lambda$-term notation, $t$~is | |
| 1169 | $\lambda x\, y.\> x$ whereas $\textit{subst}~\sigma~t$ is $\lambda x\, y.\> y$.
 | |
| 35284 
9edc2bd6d2bd
enabled Nitpick's support for quotient types + shortened the Nitpick tests a bit
 blanchet parents: 
35220diff
changeset | 1170 | The bug is in \textit{subst\/}: The $\textit{lift}~(\sigma~m)~1$ call should be
 | 
| 33191 | 1171 | replaced with $\textit{lift}~(\sigma~m)~0$.
 | 
| 1172 | ||
| 1173 | An interesting aspect of Nitpick's verbose output is that it assigned inceasing | |
| 38181 | 1174 | cardinalities from 1 to 10 to the type $\textit{nat} \Rightarrow \textit{tm}$.
 | 
| 33191 | 1175 | For the formula of interest, knowing 6 values of that type was enough to find | 
| 1176 | the counterexample. Without boxing, $46\,656$ ($= 6^6$) values must be | |
| 1177 | considered, a hopeless undertaking: | |
| 1178 | ||
| 1179 | \prew | |
| 1180 | \textbf{nitpick} [\textit{dont\_box}] \\[2\smallskipamount]
 | |
| 38183 | 1181 | {\slshape Nitpick ran out of time after checking 3 of 10 scopes.}
 | 
| 33191 | 1182 | \postw | 
| 1183 | ||
| 1184 | {\looseness=-1
 | |
| 1185 | Boxing can be enabled or disabled globally or on a per-type basis using the | |
| 35665 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35386diff
changeset | 1186 | \textit{box} option. Nitpick usually performs reasonable choices about which
 | 
| 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35386diff
changeset | 1187 | types should be boxed, but option tweaking sometimes helps. A related optimization, | 
| 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35386diff
changeset | 1188 | ``finalization,'' attempts to wrap functions that constant at all but finitely | 
| 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35386diff
changeset | 1189 | many points (e.g., finite sets); see the documentation for the \textit{finalize}
 | 
| 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35386diff
changeset | 1190 | option in \S\ref{scope-of-search} for details.
 | 
| 33191 | 1191 | |
| 1192 | } | |
| 1193 | ||
| 1194 | \subsection{Scope Monotonicity}
 | |
| 1195 | \label{scope-monotonicity}
 | |
| 1196 | ||
| 1197 | The \textit{card} option (together with \textit{iter}, \textit{bisim\_depth},
 | |
| 1198 | and \textit{max}) controls which scopes are actually tested. In general, to
 | |
| 1199 | exhaust all models below a certain cardinality bound, the number of scopes that | |
| 1200 | Nitpick must consider increases exponentially with the number of type variables | |
| 1201 | (and \textbf{typedecl}'d types) occurring in the formula. Given the default
 | |
| 38181 | 1202 | cardinality specification of 1--10, no fewer than $10^4 = 10\,000$ scopes must be | 
| 33191 | 1203 | considered for a formula involving $'a$, $'b$, $'c$, and $'d$. | 
| 1204 | ||
| 1205 | Fortunately, many formulas exhibit a property called \textsl{scope
 | |
| 1206 | monotonicity}, meaning that if the formula is falsifiable for a given scope, | |
| 1207 | it is also falsifiable for all larger scopes \cite[p.~165]{jackson-2006}.
 | |
| 1208 | ||
| 1209 | Consider the formula | |
| 1210 | ||
| 1211 | \prew | |
| 1212 | \textbf{lemma}~``$\textit{length~xs} = \textit{length~ys} \,\Longrightarrow\, \textit{rev}~(\textit{zip~xs~ys}) = \textit{zip~xs}~(\textit{rev~ys})$''
 | |
| 1213 | \postw | |
| 1214 | ||
| 1215 | where \textit{xs} is of type $'a~\textit{list}$ and \textit{ys} is of type
 | |
| 38181 | 1216 | $'b~\textit{list}$. A priori, Nitpick would need to consider $1\,000$ scopes to
 | 
| 38274 | 1217 | exhaust the specification \textit{card}~= 1--10 (10 cardinalies for $'a$
 | 
| 1218 | $\times$ 10 cardinalities for $'b$ $\times$ 10 cardinalities for the datatypes). | |
| 1219 | However, our intuition tells us that any counterexample found with a small scope | |
| 1220 | would still be a counterexample in a larger scope---by simply ignoring the fresh | |
| 1221 | $'a$ and $'b$ values provided by the larger scope. Nitpick comes to the same | |
| 1222 | conclusion after a careful inspection of the formula and the relevant | |
| 1223 | definitions: | |
| 33191 | 1224 | |
| 1225 | \prew | |
| 1226 | \textbf{nitpick}~[\textit{verbose}] \\[2\smallskipamount]
 | |
| 1227 | \slshape | |
| 1228 | The types ``\kern1pt$'a$'' and ``\kern1pt$'b$'' passed the monotonicity test. | |
| 1229 | Nitpick might be able to skip some scopes. | |
| 1230 | \\[2\smallskipamount] | |
| 38181 | 1231 | Trying 10 scopes: \\ | 
| 33191 | 1232 | \hbox{}\qquad \textit{card} $'a$~= 1, \textit{card} $'b$~= 1,
 | 
| 1233 | \textit{card} \textit{nat}~= 1, \textit{card} ``$('a \times {'}b)$
 | |
| 35712 
77aa29bf14ee
added a mechanism to Nitpick to support custom rendering of terms, and used it for multisets
 blanchet parents: 
35710diff
changeset | 1234 | \textit{list\/}''~= 1, \\
 | 
| 
77aa29bf14ee
added a mechanism to Nitpick to support custom rendering of terms, and used it for multisets
 blanchet parents: 
35710diff
changeset | 1235 | \hbox{}\qquad\quad \textit{card} ``\kern1pt$'a$ \textit{list\/}''~= 1, and
 | 
| 
77aa29bf14ee
added a mechanism to Nitpick to support custom rendering of terms, and used it for multisets
 blanchet parents: 
35710diff
changeset | 1236 | \textit{card} ``\kern1pt$'b$ \textit{list\/}''~= 1. \\
 | 
| 33191 | 1237 | \hbox{}\qquad \textit{card} $'a$~= 2, \textit{card} $'b$~= 2,
 | 
| 1238 | \textit{card} \textit{nat}~= 2, \textit{card} ``$('a \times {'}b)$
 | |
| 35712 
77aa29bf14ee
added a mechanism to Nitpick to support custom rendering of terms, and used it for multisets
 blanchet parents: 
35710diff
changeset | 1239 | \textit{list\/}''~= 2, \\
 | 
| 
77aa29bf14ee
added a mechanism to Nitpick to support custom rendering of terms, and used it for multisets
 blanchet parents: 
35710diff
changeset | 1240 | \hbox{}\qquad\quad \textit{card} ``\kern1pt$'a$ \textit{list\/}''~= 2, and
 | 
| 
77aa29bf14ee
added a mechanism to Nitpick to support custom rendering of terms, and used it for multisets
 blanchet parents: 
35710diff
changeset | 1241 | \textit{card} ``\kern1pt$'b$ \textit{list\/}''~= 2. \\
 | 
| 33191 | 1242 | \hbox{}\qquad $\qquad\vdots$ \\[.5\smallskipamount]
 | 
| 38181 | 1243 | \hbox{}\qquad \textit{card} $'a$~= 10, \textit{card} $'b$~= 10,
 | 
| 1244 | \textit{card} \textit{nat}~= 10, \textit{card} ``$('a \times {'}b)$
 | |
| 1245 | \textit{list\/}''~= 10, \\
 | |
| 1246 | \hbox{}\qquad\quad \textit{card} ``\kern1pt$'a$ \textit{list\/}''~= 10, and
 | |
| 1247 | \textit{card} ``\kern1pt$'b$ \textit{list\/}''~= 10.
 | |
| 33191 | 1248 | \\[2\smallskipamount] | 
| 1249 | Nitpick found a counterexample for | |
| 1250 | \textit{card} $'a$~= 5, \textit{card} $'b$~= 5,
 | |
| 1251 | \textit{card} \textit{nat}~= 5, \textit{card} ``$('a \times {'}b)$
 | |
| 35712 
77aa29bf14ee
added a mechanism to Nitpick to support custom rendering of terms, and used it for multisets
 blanchet parents: 
35710diff
changeset | 1252 | \textit{list\/}''~= 5, \textit{card} ``\kern1pt$'a$ \textit{list\/}''~= 5, and
 | 
| 
77aa29bf14ee
added a mechanism to Nitpick to support custom rendering of terms, and used it for multisets
 blanchet parents: 
35710diff
changeset | 1253 | \textit{card} ``\kern1pt$'b$ \textit{list\/}''~= 5:
 | 
| 33191 | 1254 | \\[2\smallskipamount] | 
| 1255 | \hbox{}\qquad Free variables: \nopagebreak \\
 | |
| 35078 
6fd1052fe463
optimization to quantifiers in Nitpick's handling of simp rules + renamed some SAT solvers
 blanchet parents: 
35072diff
changeset | 1256 | \hbox{}\qquad\qquad $\textit{xs} = [a_1, a_2]$ \\
 | 
| 
6fd1052fe463
optimization to quantifiers in Nitpick's handling of simp rules + renamed some SAT solvers
 blanchet parents: 
35072diff
changeset | 1257 | \hbox{}\qquad\qquad $\textit{ys} = [b_1, b_1]$ \\[2\smallskipamount]
 | 
| 33191 | 1258 | Total time: 1636 ms. | 
| 1259 | \postw | |
| 1260 | ||
| 1261 | In theory, it should be sufficient to test a single scope: | |
| 1262 | ||
| 1263 | \prew | |
| 38181 | 1264 | \textbf{nitpick}~[\textit{card}~= 10]
 | 
| 33191 | 1265 | \postw | 
| 1266 | ||
| 1267 | However, this is often less efficient in practice and may lead to overly complex | |
| 1268 | counterexamples. | |
| 1269 | ||
| 1270 | If the monotonicity check fails but we believe that the formula is monotonic (or | |
| 1271 | we don't mind missing some counterexamples), we can pass the | |
| 1272 | \textit{mono} option. To convince yourself that this option is risky,
 | |
| 1273 | simply consider this example from \S\ref{skolemization}:
 | |
| 1274 | ||
| 1275 | \prew | |
| 1276 | \textbf{lemma} ``$\exists g.\; \forall x\Colon 'b.~g~(f~x) = x
 | |
| 1277 |  \,\Longrightarrow\, \forall y\Colon {'}a.\; \exists x.~y = f~x$'' \\
 | |
| 1278 | \textbf{nitpick} [\textit{mono}] \\[2\smallskipamount]
 | |
| 1279 | {\slshape Nitpick found no counterexample.} \\[2\smallskipamount]
 | |
| 1280 | \textbf{nitpick} \\[2\smallskipamount]
 | |
| 1281 | \slshape | |
| 1282 | Nitpick found a counterexample for \textit{card} $'a$~= 2 and \textit{card} $'b$~=~1: \\
 | |
| 1283 | \hbox{}\qquad $\vdots$
 | |
| 1284 | \postw | |
| 1285 | ||
| 1286 | (It turns out the formula holds if and only if $\textit{card}~'a \le
 | |
| 1287 | \textit{card}~'b$.) Although this is rarely advisable, the automatic
 | |
| 1288 | monotonicity checks can be disabled by passing \textit{non\_mono}
 | |
| 1289 | (\S\ref{optimizations}).
 | |
| 1290 | ||
| 1291 | As insinuated in \S\ref{natural-numbers-and-integers} and
 | |
| 1292 | \S\ref{inductive-datatypes}, \textit{nat}, \textit{int}, and inductive datatypes
 | |
| 1293 | are normally monotonic and treated as such. The same is true for record types, | |
| 38274 | 1294 | \textit{rat}, and \textit{real}. Thus, given the
 | 
| 38181 | 1295 | cardinality specification 1--10, a formula involving \textit{nat}, \textit{int},
 | 
| 33191 | 1296 | \textit{int~list}, \textit{rat}, and \textit{rat~list} will lead Nitpick to
 | 
| 38274 | 1297 | consider only 10~scopes instead of $10\,000$. On the other hand, | 
| 1298 | \textbf{typedef}s and quotient types are generally nonmonotonic.
 | |
| 33191 | 1299 | |
| 34982 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1300 | \subsection{Inductive Properties}
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1301 | \label{inductive-properties}
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1302 | |
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1303 | Inductive properties are a particular pain to prove, because the failure to | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1304 | establish an induction step can mean several things: | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1305 | % | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1306 | \begin{enumerate}
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1307 | \item The property is invalid. | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1308 | \item The property is valid but is too weak to support the induction step. | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1309 | \item The property is valid and strong enough; it's just that we haven't found | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1310 | the proof yet. | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1311 | \end{enumerate}
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1312 | % | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1313 | Depending on which scenario applies, we would take the appropriate course of | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1314 | action: | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1315 | % | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1316 | \begin{enumerate}
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1317 | \item Repair the statement of the property so that it becomes valid. | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1318 | \item Generalize the property and/or prove auxiliary properties. | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1319 | \item Work harder on a proof. | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1320 | \end{enumerate}
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1321 | % | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1322 | How can we distinguish between the three scenarios? Nitpick's normal mode of | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1323 | operation can often detect scenario 1, and Isabelle's automatic tactics help with | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1324 | scenario 3. Using appropriate techniques, it is also often possible to use | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1325 | Nitpick to identify scenario 2. Consider the following transition system, | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1326 | in which natural numbers represent states: | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1327 | |
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1328 | \prew | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1329 | \textbf{inductive\_set}~\textit{reach}~\textbf{where} \\
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1330 | ``$(4\Colon\textit{nat}) \in \textit{reach\/}$'' $\mid$ \\
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1331 | ``$\lbrakk n < 4;\> n \in \textit{reach\/}\rbrakk \,\Longrightarrow\, 3 * n + 1 \in \textit{reach\/}$'' $\mid$ \\
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1332 | ``$n \in \textit{reach} \,\Longrightarrow n + 2 \in \textit{reach\/}$''
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1333 | \postw | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1334 | |
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1335 | We will try to prove that only even numbers are reachable: | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1336 | |
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1337 | \prew | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1338 | \textbf{lemma}~``$n \in \textit{reach} \,\Longrightarrow\, 2~\textrm{dvd}~n$''
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1339 | \postw | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1340 | |
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1341 | Does this property hold? Nitpick cannot find a counterexample within 30 seconds, | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1342 | so let's attempt a proof by induction: | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1343 | |
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1344 | \prew | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1345 | \textbf{apply}~(\textit{induct~set}{:}~\textit{reach\/}) \\
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1346 | \textbf{apply}~\textit{auto}
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1347 | \postw | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1348 | |
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1349 | This leaves us in the following proof state: | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1350 | |
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1351 | \prew | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1352 | {\slshape goal (2 subgoals): \\
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1353 | \phantom{0}1. ${\bigwedge}n.\;\, \lbrakk n \in \textit{reach\/};\, n < 4;\, 2~\textsl{dvd}~n\rbrakk \,\Longrightarrow\, 2~\textsl{dvd}~\textit{Suc}~(3 * n)$ \\
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1354 | \phantom{0}2. ${\bigwedge}n.\;\, \lbrakk n \in \textit{reach\/};\, 2~\textsl{dvd}~n\rbrakk \,\Longrightarrow\, 2~\textsl{dvd}~\textit{Suc}~(\textit{Suc}~n)$
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1355 | } | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1356 | \postw | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1357 | |
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1358 | If we run Nitpick on the first subgoal, it still won't find any | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1359 | counterexample; and yet, \textit{auto} fails to go further, and \textit{arith}
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1360 | is helpless. However, notice the $n \in \textit{reach}$ assumption, which
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1361 | strengthens the induction hypothesis but is not immediately usable in the proof. | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1362 | If we remove it and invoke Nitpick, this time we get a counterexample: | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1363 | |
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1364 | \prew | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1365 | \textbf{apply}~(\textit{thin\_tac}~``$n \in \textit{reach\/}$'') \\
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1366 | \textbf{nitpick} \\[2\smallskipamount]
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1367 | \slshape Nitpick found a counterexample: \\[2\smallskipamount] | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1368 | \hbox{}\qquad Skolem constant: \nopagebreak \\
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1369 | \hbox{}\qquad\qquad $n = 0$
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1370 | \postw | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1371 | |
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1372 | Indeed, 0 < 4, 2 divides 0, but 2 does not divide 1. We can use this information | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1373 | to strength the lemma: | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1374 | |
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1375 | \prew | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1376 | \textbf{lemma}~``$n \in \textit{reach} \,\Longrightarrow\, 2~\textrm{dvd}~n \mathrel{\lor} n \not= 0$''
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1377 | \postw | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1378 | |
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1379 | Unfortunately, the proof by induction still gets stuck, except that Nitpick now | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1380 | finds the counterexample $n = 2$. We generalize the lemma further to | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1381 | |
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1382 | \prew | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1383 | \textbf{lemma}~``$n \in \textit{reach} \,\Longrightarrow\, 2~\textrm{dvd}~n \mathrel{\lor} n \ge 4$''
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1384 | \postw | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1385 | |
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1386 | and this time \textit{arith} can finish off the subgoals.
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1387 | |
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1388 | A similar technique can be employed for structural induction. The | 
| 35180 
c57dba973391
more work on Nitpick's support for nonstandard models + fix in model reconstruction
 blanchet parents: 
35178diff
changeset | 1389 | following mini formalization of full binary trees will serve as illustration: | 
| 34982 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1390 | |
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1391 | \prew | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1392 | \textbf{datatype} $\kern1pt'a$~\textit{bin\_tree} = $\textit{Leaf}~{\kern1pt'a}$ $\mid$ $\textit{Branch}$ ``\kern1pt$'a$ \textit{bin\_tree}'' ``\kern1pt$'a$ \textit{bin\_tree}'' \\[2\smallskipamount]
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1393 | \textbf{primrec}~\textit{labels}~\textbf{where} \\
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1394 | ``$\textit{labels}~(\textit{Leaf}~a) = \{a\}$'' $\mid$ \\
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1395 | ``$\textit{labels}~(\textit{Branch}~t~u) = \textit{labels}~t \mathrel{\cup} \textit{labels}~u$'' \\[2\smallskipamount]
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1396 | \textbf{primrec}~\textit{swap}~\textbf{where} \\
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1397 | ``$\textit{swap}~(\textit{Leaf}~c)~a~b =$ \\
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1398 | \phantom{``}$(\textrm{if}~c = a~\textrm{then}~\textit{Leaf}~b~\textrm{else~if}~c = b~\textrm{then}~\textit{Leaf}~a~\textrm{else}~\textit{Leaf}~c)$'' $\mid$ \\
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1399 | ``$\textit{swap}~(\textit{Branch}~t~u)~a~b = \textit{Branch}~(\textit{swap}~t~a~b)~(\textit{swap}~u~a~b)$''
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1400 | \postw | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1401 | |
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1402 | The \textit{labels} function returns the set of labels occurring on leaves of a
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1403 | tree, and \textit{swap} exchanges two labels. Intuitively, if two distinct
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1404 | labels $a$ and $b$ occur in a tree $t$, they should also occur in the tree | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1405 | obtained by swapping $a$ and $b$: | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1406 | |
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1407 | \prew | 
| 35180 
c57dba973391
more work on Nitpick's support for nonstandard models + fix in model reconstruction
 blanchet parents: 
35178diff
changeset | 1408 | \textbf{lemma} $``\{a, b\} \subseteq \textit{labels}~t \,\Longrightarrow\, \textit{labels}~(\textit{swap}~t~a~b) = \textit{labels}~t$''
 | 
| 34982 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1409 | \postw | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1410 | |
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1411 | Nitpick can't find any counterexample, so we proceed with induction | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1412 | (this time favoring a more structured style): | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1413 | |
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1414 | \prew | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1415 | \textbf{proof}~(\textit{induct}~$t$) \\
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1416 | \hbox{}\quad \textbf{case}~\textit{Leaf}~\textbf{thus}~\textit{?case}~\textbf{by}~\textit{simp} \\
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1417 | \textbf{next} \\
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1418 | \hbox{}\quad \textbf{case}~$(\textit{Branch}~t~u)$~\textbf{thus} \textit{?case}
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1419 | \postw | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1420 | |
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1421 | Nitpick can't find any counterexample at this point either, but it makes the | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1422 | following suggestion: | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1423 | |
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1424 | \prew | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1425 | \slshape | 
| 35178 | 1426 | Hint: To check that the induction hypothesis is general enough, try this command: | 
| 35183 
8580ba651489
reintroduce structural induction hint in Nitpick
 blanchet parents: 
35180diff
changeset | 1427 | \textbf{nitpick}~[\textit{non\_std}, \textit{show\_all}].
 | 
| 34982 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1428 | \postw | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1429 | |
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1430 | If we follow the hint, we get a ``nonstandard'' counterexample for the step: | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1431 | |
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1432 | \prew | 
| 35180 
c57dba973391
more work on Nitpick's support for nonstandard models + fix in model reconstruction
 blanchet parents: 
35178diff
changeset | 1433 | \slshape Nitpick found a nonstandard counterexample for \textit{card} $'a$ = 3: \\[2\smallskipamount]
 | 
| 34982 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1434 | \hbox{}\qquad Free variables: \nopagebreak \\
 | 
| 35078 
6fd1052fe463
optimization to quantifiers in Nitpick's handling of simp rules + renamed some SAT solvers
 blanchet parents: 
35072diff
changeset | 1435 | \hbox{}\qquad\qquad $a = a_1$ \\
 | 
| 
6fd1052fe463
optimization to quantifiers in Nitpick's handling of simp rules + renamed some SAT solvers
 blanchet parents: 
35072diff
changeset | 1436 | \hbox{}\qquad\qquad $b = a_2$ \\
 | 
| 
6fd1052fe463
optimization to quantifiers in Nitpick's handling of simp rules + renamed some SAT solvers
 blanchet parents: 
35072diff
changeset | 1437 | \hbox{}\qquad\qquad $t = \xi_1$ \\
 | 
| 
6fd1052fe463
optimization to quantifiers in Nitpick's handling of simp rules + renamed some SAT solvers
 blanchet parents: 
35072diff
changeset | 1438 | \hbox{}\qquad\qquad $u = \xi_2$ \\
 | 
| 35180 
c57dba973391
more work on Nitpick's support for nonstandard models + fix in model reconstruction
 blanchet parents: 
35178diff
changeset | 1439 | \hbox{}\qquad Datatype: \nopagebreak \\
 | 
| 
c57dba973391
more work on Nitpick's support for nonstandard models + fix in model reconstruction
 blanchet parents: 
35178diff
changeset | 1440 | \hbox{}\qquad\qquad $\alpha~\textit{btree} = \{\xi_1 \mathbin{=} \textit{Branch}~\xi_1~\xi_1,\> \xi_2 \mathbin{=} \textit{Branch}~\xi_2~\xi_2,\> \textit{Branch}~\xi_1~\xi_2\}$ \\
 | 
| 34982 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1441 | \hbox{}\qquad {\slshape Constants:} \nopagebreak \\
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1442 | \hbox{}\qquad\qquad $\textit{labels} = \undef
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1443 |     (\!\begin{aligned}[t]%
 | 
| 35180 
c57dba973391
more work on Nitpick's support for nonstandard models + fix in model reconstruction
 blanchet parents: 
35178diff
changeset | 1444 |     & \xi_1 := \{a_2, a_3\},\> \xi_2 := \{a_1\},\> \\[-2pt]
 | 
| 
c57dba973391
more work on Nitpick's support for nonstandard models + fix in model reconstruction
 blanchet parents: 
35178diff
changeset | 1445 |     & \textit{Branch}~\xi_1~\xi_2 := \{a_1, a_2, a_3\})\end{aligned}$ \\
 | 
| 34982 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1446 | \hbox{}\qquad\qquad $\lambda x_1.\> \textit{swap}~x_1~a~b = \undef
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1447 |     (\!\begin{aligned}[t]%
 | 
| 35078 
6fd1052fe463
optimization to quantifiers in Nitpick's handling of simp rules + renamed some SAT solvers
 blanchet parents: 
35072diff
changeset | 1448 | & \xi_1 := \xi_2,\> \xi_2 := \xi_2, \\[-2pt] | 
| 35180 
c57dba973391
more work on Nitpick's support for nonstandard models + fix in model reconstruction
 blanchet parents: 
35178diff
changeset | 1449 |     & \textit{Branch}~\xi_1~\xi_2 := \xi_2)\end{aligned}$ \\[2\smallskipamount]
 | 
| 36126 | 1450 | The existence of a nonstandard model suggests that the induction hypothesis is not general enough or may even | 
| 1451 | be wrong. See the Nitpick manual's ``Inductive Properties'' section for details (``\textit{isabelle doc nitpick}'').
 | |
| 34982 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1452 | \postw | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1453 | |
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1454 | Reading the Nitpick manual is a most excellent idea. | 
| 35183 
8580ba651489
reintroduce structural induction hint in Nitpick
 blanchet parents: 
35180diff
changeset | 1455 | But what's going on? The \textit{non\_std} option told the tool to look for
 | 
| 
8580ba651489
reintroduce structural induction hint in Nitpick
 blanchet parents: 
35180diff
changeset | 1456 | nonstandard models of binary trees, which means that new ``nonstandard'' trees | 
| 
8580ba651489
reintroduce structural induction hint in Nitpick
 blanchet parents: 
35180diff
changeset | 1457 | $\xi_1, \xi_2, \ldots$, are now allowed in addition to the standard trees | 
| 
8580ba651489
reintroduce structural induction hint in Nitpick
 blanchet parents: 
35180diff
changeset | 1458 | generated by the \textit{Leaf} and \textit{Branch} constructors.%
 | 
| 34982 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1459 | \footnote{Notice the similarity between allowing nonstandard trees here and
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1460 | allowing unreachable states in the preceding example (by removing the ``$n \in | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1461 | \textit{reach\/}$'' assumption). In both cases, we effectively enlarge the
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1462 | set of objects over which the induction is performed while doing the step | 
| 35078 
6fd1052fe463
optimization to quantifiers in Nitpick's handling of simp rules + renamed some SAT solvers
 blanchet parents: 
35072diff
changeset | 1463 | in order to test the induction hypothesis's strength.} | 
| 35180 
c57dba973391
more work on Nitpick's support for nonstandard models + fix in model reconstruction
 blanchet parents: 
35178diff
changeset | 1464 | Unlike standard trees, these new trees contain cycles. We will see later that | 
| 
c57dba973391
more work on Nitpick's support for nonstandard models + fix in model reconstruction
 blanchet parents: 
35178diff
changeset | 1465 | every property of acyclic trees that can be proved without using induction also | 
| 
c57dba973391
more work on Nitpick's support for nonstandard models + fix in model reconstruction
 blanchet parents: 
35178diff
changeset | 1466 | holds for cyclic trees. Hence, | 
| 34982 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1467 | % | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1468 | \begin{quote}
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1469 | \textsl{If the induction
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1470 | hypothesis is strong enough, the induction step will hold even for nonstandard | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1471 | objects, and Nitpick won't find any nonstandard counterexample.} | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1472 | \end{quote}
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1473 | % | 
| 35180 
c57dba973391
more work on Nitpick's support for nonstandard models + fix in model reconstruction
 blanchet parents: 
35178diff
changeset | 1474 | But here the tool find some nonstandard trees $t = \xi_1$ | 
| 
c57dba973391
more work on Nitpick's support for nonstandard models + fix in model reconstruction
 blanchet parents: 
35178diff
changeset | 1475 | and $u = \xi_2$ such that $a \notin \textit{labels}~t$, $b \in
 | 
| 
c57dba973391
more work on Nitpick's support for nonstandard models + fix in model reconstruction
 blanchet parents: 
35178diff
changeset | 1476 | \textit{labels}~t$, $a \in \textit{labels}~u$, and $b \notin \textit{labels}~u$.
 | 
| 34982 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1477 | Because neither tree contains both $a$ and $b$, the induction hypothesis tells | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1478 | us nothing about the labels of $\textit{swap}~t~a~b$ and $\textit{swap}~u~a~b$,
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1479 | and as a result we know nothing about the labels of the tree | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1480 | $\textit{swap}~(\textit{Branch}~t~u)~a~b$, which by definition equals
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1481 | $\textit{Branch}$ $(\textit{swap}~t~a~b)$ $(\textit{swap}~u~a~b)$, whose
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1482 | labels are $\textit{labels}$ $(\textit{swap}~t~a~b) \mathrel{\cup}
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1483 | \textit{labels}$ $(\textit{swap}~u~a~b)$.
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1484 | |
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1485 | The solution is to ensure that we always know what the labels of the subtrees | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1486 | are in the inductive step, by covering the cases where $a$ and/or~$b$ is not in | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1487 | $t$ in the statement of the lemma: | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1488 | |
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1489 | \prew | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1490 | \textbf{lemma} ``$\textit{labels}~(\textit{swap}~t~a~b) = {}$ \\
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1491 | \phantom{\textbf{lemma} ``}$(\textrm{if}~a \in \textit{labels}~t~\textrm{then}$ \nopagebreak \\
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1492 | \phantom{\textbf{lemma} ``(\quad}$\textrm{if}~b \in \textit{labels}~t~\textrm{then}~\textit{labels}~t~\textrm{else}~(\textit{labels}~t - \{a\}) \mathrel{\cup} \{b\}$ \\
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1493 | \phantom{\textbf{lemma} ``(}$\textrm{else}$ \\
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1494 | \phantom{\textbf{lemma} ``(\quad}$\textrm{if}~b \in \textit{labels}~t~\textrm{then}~(\textit{labels}~t - \{b\}) \mathrel{\cup} \{a\}~\textrm{else}~\textit{labels}~t)$''
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1495 | \postw | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1496 | |
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1497 | This time, Nitpick won't find any nonstandard counterexample, and we can perform | 
| 35078 
6fd1052fe463
optimization to quantifiers in Nitpick's handling of simp rules + renamed some SAT solvers
 blanchet parents: 
35072diff
changeset | 1498 | the induction step using \textit{auto}.
 | 
| 34982 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1499 | |
| 33191 | 1500 | \section{Case Studies}
 | 
| 1501 | \label{case-studies}
 | |
| 1502 | ||
| 1503 | As a didactic device, the previous section focused mostly on toy formulas whose | |
| 1504 | validity can easily be assessed just by looking at the formula. We will now | |
| 1505 | review two somewhat more realistic case studies that are within Nitpick's | |
| 1506 | reach:\ a context-free grammar modeled by mutually inductive sets and a | |
| 1507 | functional implementation of AA trees. The results presented in this | |
| 1508 | section were produced with the following settings: | |
| 1509 | ||
| 1510 | \prew | |
| 36268 | 1511 | \textbf{nitpick\_params} [\textit{max\_potential}~= 0]
 | 
| 33191 | 1512 | \postw | 
| 1513 | ||
| 1514 | \subsection{A Context-Free Grammar}
 | |
| 1515 | \label{a-context-free-grammar}
 | |
| 1516 | ||
| 1517 | Our first case study is taken from section 7.4 in the Isabelle tutorial | |
| 1518 | \cite{isa-tutorial}. The following grammar, originally due to Hopcroft and
 | |
| 1519 | Ullman, produces all strings with an equal number of $a$'s and $b$'s: | |
| 1520 | ||
| 1521 | \prew | |
| 1522 | \begin{tabular}{@{}r@{$\;\,$}c@{$\;\,$}l@{}}
 | |
| 1523 | $S$ & $::=$ & $\epsilon \mid bA \mid aB$ \\ | |
| 1524 | $A$ & $::=$ & $aS \mid bAA$ \\ | |
| 1525 | $B$ & $::=$ & $bS \mid aBB$ | |
| 1526 | \end{tabular}
 | |
| 1527 | \postw | |
| 1528 | ||
| 1529 | The intuition behind the grammar is that $A$ generates all string with one more | |
| 1530 | $a$ than $b$'s and $B$ generates all strings with one more $b$ than $a$'s. | |
| 1531 | ||
| 1532 | The alphabet consists exclusively of $a$'s and $b$'s: | |
| 1533 | ||
| 1534 | \prew | |
| 1535 | \textbf{datatype} \textit{alphabet}~= $a$ $\mid$ $b$
 | |
| 1536 | \postw | |
| 1537 | ||
| 1538 | Strings over the alphabet are represented by \textit{alphabet list}s.
 | |
| 1539 | Nonterminals in the grammar become sets of strings. The production rules | |
| 1540 | presented above can be expressed as a mutually inductive definition: | |
| 1541 | ||
| 1542 | \prew | |
| 1543 | \textbf{inductive\_set} $S$ \textbf{and} $A$ \textbf{and} $B$ \textbf{where} \\
 | |
| 1544 | \textit{R1}:\kern.4em ``$[] \in S$'' $\,\mid$ \\
 | |
| 1545 | \textit{R2}:\kern.4em ``$w \in A\,\Longrightarrow\, b \mathbin{\#} w \in S$'' $\,\mid$ \\
 | |
| 1546 | \textit{R3}:\kern.4em ``$w \in B\,\Longrightarrow\, a \mathbin{\#} w \in S$'' $\,\mid$ \\
 | |
| 1547 | \textit{R4}:\kern.4em ``$w \in S\,\Longrightarrow\, a \mathbin{\#} w \in A$'' $\,\mid$ \\
 | |
| 1548 | \textit{R5}:\kern.4em ``$w \in S\,\Longrightarrow\, b \mathbin{\#} w \in S$'' $\,\mid$ \\
 | |
| 1549 | \textit{R6}:\kern.4em ``$\lbrakk v \in B;\> v \in B\rbrakk \,\Longrightarrow\, a \mathbin{\#} v \mathbin{@} w \in B$''
 | |
| 1550 | \postw | |
| 1551 | ||
| 1552 | The conversion of the grammar into the inductive definition was done manually by | |
| 1553 | Joe Blow, an underpaid undergraduate student. As a result, some errors might | |
| 1554 | have sneaked in. | |
| 1555 | ||
| 1556 | Debugging faulty specifications is at the heart of Nitpick's \textsl{raison
 | |
| 1557 | d'\^etre}. A good approach is to state desirable properties of the specification | |
| 1558 | (here, that $S$ is exactly the set of strings over $\{a, b\}$ with as many $a$'s
 | |
| 1559 | as $b$'s) and check them with Nitpick. If the properties are correctly stated, | |
| 1560 | counterexamples will point to bugs in the specification. For our grammar | |
| 1561 | example, we will proceed in two steps, separating the soundness and the | |
| 1562 | completeness of the set $S$. First, soundness: | |
| 1563 | ||
| 1564 | \prew | |
| 35284 
9edc2bd6d2bd
enabled Nitpick's support for quotient types + shortened the Nitpick tests a bit
 blanchet parents: 
35220diff
changeset | 1565 | \textbf{theorem}~\textit{S\_sound\/}: \\
 | 
| 33191 | 1566 | ``$w \in S \longrightarrow \textit{length}~[x\mathbin{\leftarrow} w.\; x = a] =
 | 
| 1567 |   \textit{length}~[x\mathbin{\leftarrow} w.\; x = b]$'' \\
 | |
| 1568 | \textbf{nitpick} \\[2\smallskipamount]
 | |
| 1569 | \slshape Nitpick found a counterexample: \\[2\smallskipamount] | |
| 1570 | \hbox{}\qquad Free variable: \nopagebreak \\
 | |
| 1571 | \hbox{}\qquad\qquad $w = [b]$
 | |
| 1572 | \postw | |
| 1573 | ||
| 1574 | It would seem that $[b] \in S$. How could this be? An inspection of the | |
| 1575 | introduction rules reveals that the only rule with a right-hand side of the form | |
| 1576 | $b \mathbin{\#} {\ldots} \in S$ that could have introduced $[b]$ into $S$ is
 | |
| 1577 | \textit{R5}:
 | |
| 1578 | ||
| 1579 | \prew | |
| 1580 | ``$w \in S\,\Longrightarrow\, b \mathbin{\#} w \in S$''
 | |
| 1581 | \postw | |
| 1582 | ||
| 1583 | On closer inspection, we can see that this rule is wrong. To match the | |
| 1584 | production $B ::= bS$, the second $S$ should be a $B$. We fix the typo and try | |
| 1585 | again: | |
| 1586 | ||
| 1587 | \prew | |
| 1588 | \textbf{nitpick} \\[2\smallskipamount]
 | |
| 1589 | \slshape Nitpick found a counterexample: \\[2\smallskipamount] | |
| 1590 | \hbox{}\qquad Free variable: \nopagebreak \\
 | |
| 1591 | \hbox{}\qquad\qquad $w = [a, a, b]$
 | |
| 1592 | \postw | |
| 1593 | ||
| 1594 | Some detective work is necessary to find out what went wrong here. To get $[a, | |
| 1595 | a, b] \in S$, we need $[a, b] \in B$ by \textit{R3}, which in turn can only come
 | |
| 1596 | from \textit{R6}:
 | |
| 1597 | ||
| 1598 | \prew | |
| 1599 | ``$\lbrakk v \in B;\> v \in B\rbrakk \,\Longrightarrow\, a \mathbin{\#} v \mathbin{@} w \in B$''
 | |
| 1600 | \postw | |
| 1601 | ||
| 1602 | Now, this formula must be wrong: The same assumption occurs twice, and the | |
| 1603 | variable $w$ is unconstrained. Clearly, one of the two occurrences of $v$ in | |
| 1604 | the assumptions should have been a $w$. | |
| 1605 | ||
| 1606 | With the correction made, we don't get any counterexample from Nitpick. Let's | |
| 1607 | move on and check completeness: | |
| 1608 | ||
| 1609 | \prew | |
| 1610 | \textbf{theorem}~\textit{S\_complete}: \\
 | |
| 1611 | ``$\textit{length}~[x\mathbin{\leftarrow} w.\; x = a] =
 | |
| 1612 |    \textit{length}~[x\mathbin{\leftarrow} w.\; x = b]
 | |
| 1613 | \longrightarrow w \in S$'' \\ | |
| 1614 | \textbf{nitpick} \\[2\smallskipamount]
 | |
| 1615 | \slshape Nitpick found a counterexample: \\[2\smallskipamount] | |
| 1616 | \hbox{}\qquad Free variable: \nopagebreak \\
 | |
| 1617 | \hbox{}\qquad\qquad $w = [b, b, a, a]$
 | |
| 1618 | \postw | |
| 1619 | ||
| 1620 | Apparently, $[b, b, a, a] \notin S$, even though it has the same numbers of | |
| 1621 | $a$'s and $b$'s. But since our inductive definition passed the soundness check, | |
| 1622 | the introduction rules we have are probably correct. Perhaps we simply lack an | |
| 1623 | introduction rule. Comparing the grammar with the inductive definition, our | |
| 1624 | suspicion is confirmed: Joe Blow simply forgot the production $A ::= bAA$, | |
| 1625 | without which the grammar cannot generate two or more $b$'s in a row. So we add | |
| 1626 | the rule | |
| 1627 | ||
| 1628 | \prew | |
| 1629 | ``$\lbrakk v \in A;\> w \in A\rbrakk \,\Longrightarrow\, b \mathbin{\#} v \mathbin{@} w \in A$''
 | |
| 1630 | \postw | |
| 1631 | ||
| 1632 | With this last change, we don't get any counterexamples from Nitpick for either | |
| 1633 | soundness or completeness. We can even generalize our result to cover $A$ and | |
| 1634 | $B$ as well: | |
| 1635 | ||
| 1636 | \prew | |
| 1637 | \textbf{theorem} \textit{S\_A\_B\_sound\_and\_complete}: \\
 | |
| 1638 | ``$w \in S \longleftrightarrow \textit{length}~[x \mathbin{\leftarrow} w.\; x = a] = \textit{length}~[x \mathbin{\leftarrow} w.\; x = b]$'' \\
 | |
| 1639 | ``$w \in A \longleftrightarrow \textit{length}~[x \mathbin{\leftarrow} w.\; x = a] = \textit{length}~[x \mathbin{\leftarrow} w.\; x = b] + 1$'' \\
 | |
| 1640 | ``$w \in B \longleftrightarrow \textit{length}~[x \mathbin{\leftarrow} w.\; x = b] = \textit{length}~[x \mathbin{\leftarrow} w.\; x = a] + 1$'' \\
 | |
| 1641 | \textbf{nitpick} \\[2\smallskipamount]
 | |
| 38183 | 1642 | \slshape Nitpick found no counterexample. | 
| 33191 | 1643 | \postw | 
| 1644 | ||
| 1645 | \subsection{AA Trees}
 | |
| 1646 | \label{aa-trees}
 | |
| 1647 | ||
| 1648 | AA trees are a kind of balanced trees discovered by Arne Andersson that provide | |
| 1649 | similar performance to red-black trees, but with a simpler implementation | |
| 1650 | \cite{andersson-1993}. They can be used to store sets of elements equipped with
 | |
| 1651 | a total order $<$. We start by defining the datatype and some basic extractor | |
| 1652 | functions: | |
| 1653 | ||
| 1654 | \prew | |
| 34982 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1655 | \textbf{datatype} $'a$~\textit{aa\_tree} = \\
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1656 | \hbox{}\quad $\Lambda$ $\mid$ $N$ ``\kern1pt$'a\Colon \textit{linorder}$'' \textit{nat} ``\kern1pt$'a$ \textit{aa\_tree}'' ``\kern1pt$'a$ \textit{aa\_tree}''  \\[2\smallskipamount]
 | 
| 33191 | 1657 | \textbf{primrec} \textit{data} \textbf{where} \\
 | 
| 1658 | ``$\textit{data}~\Lambda = \undef$'' $\,\mid$ \\
 | |
| 1659 | ``$\textit{data}~(N~x~\_~\_~\_) = x$'' \\[2\smallskipamount]
 | |
| 1660 | \textbf{primrec} \textit{dataset} \textbf{where} \\
 | |
| 1661 | ``$\textit{dataset}~\Lambda = \{\}$'' $\,\mid$ \\
 | |
| 1662 | ``$\textit{dataset}~(N~x~\_~t~u) = \{x\} \cup \textit{dataset}~t \mathrel{\cup} \textit{dataset}~u$'' \\[2\smallskipamount]
 | |
| 1663 | \textbf{primrec} \textit{level} \textbf{where} \\
 | |
| 1664 | ``$\textit{level}~\Lambda = 0$'' $\,\mid$ \\
 | |
| 1665 | ``$\textit{level}~(N~\_~k~\_~\_) = k$'' \\[2\smallskipamount]
 | |
| 1666 | \textbf{primrec} \textit{left} \textbf{where} \\
 | |
| 1667 | ``$\textit{left}~\Lambda = \Lambda$'' $\,\mid$ \\
 | |
| 1668 | ``$\textit{left}~(N~\_~\_~t~\_) = t$'' \\[2\smallskipamount]
 | |
| 1669 | \textbf{primrec} \textit{right} \textbf{where} \\
 | |
| 1670 | ``$\textit{right}~\Lambda = \Lambda$'' $\,\mid$ \\
 | |
| 1671 | ``$\textit{right}~(N~\_~\_~\_~u) = u$''
 | |
| 1672 | \postw | |
| 1673 | ||
| 1674 | The wellformedness criterion for AA trees is fairly complex. Wikipedia states it | |
| 1675 | as follows \cite{wikipedia-2009-aa-trees}:
 | |
| 1676 | ||
| 1677 | \kern.2\parskip %% TYPESETTING | |
| 1678 | ||
| 1679 | \pre | |
| 1680 | Each node has a level field, and the following invariants must remain true for | |
| 1681 | the tree to be valid: | |
| 1682 | ||
| 1683 | \raggedright | |
| 1684 | ||
| 1685 | \kern-.4\parskip %% TYPESETTING | |
| 1686 | ||
| 1687 | \begin{enum}
 | |
| 1688 | \item[] | |
| 1689 | \begin{enum}
 | |
| 1690 | \item[1.] The level of a leaf node is one. | |
| 1691 | \item[2.] The level of a left child is strictly less than that of its parent. | |
| 1692 | \item[3.] The level of a right child is less than or equal to that of its parent. | |
| 1693 | \item[4.] The level of a right grandchild is strictly less than that of its grandparent. | |
| 1694 | \item[5.] Every node of level greater than one must have two children. | |
| 1695 | \end{enum}
 | |
| 1696 | \end{enum}
 | |
| 1697 | \post | |
| 1698 | ||
| 1699 | \kern.4\parskip %% TYPESETTING | |
| 1700 | ||
| 1701 | The \textit{wf} predicate formalizes this description:
 | |
| 1702 | ||
| 1703 | \prew | |
| 1704 | \textbf{primrec} \textit{wf} \textbf{where} \\
 | |
| 1705 | ``$\textit{wf}~\Lambda = \textit{True}$'' $\,\mid$ \\
 | |
| 1706 | ``$\textit{wf}~(N~\_~k~t~u) =$ \\
 | |
| 1707 | \phantom{``}$(\textrm{if}~t = \Lambda~\textrm{then}$ \\
 | |
| 1708 | \phantom{``$(\quad$}$k = 1 \mathrel{\land} (u = \Lambda \mathrel{\lor} (\textit{level}~u = 1 \mathrel{\land} \textit{left}~u = \Lambda \mathrel{\land} \textit{right}~u = \Lambda))$ \\
 | |
| 1709 | \phantom{``$($}$\textrm{else}$ \\
 | |
| 33193 | 1710 | \hbox{}\phantom{``$(\quad$}$\textit{wf}~t \mathrel{\land} \textit{wf}~u
 | 
| 33191 | 1711 | \mathrel{\land} u \not= \Lambda \mathrel{\land} \textit{level}~t < k
 | 
| 33193 | 1712 | \mathrel{\land} \textit{level}~u \le k$ \\
 | 
| 1713 | \hbox{}\phantom{``$(\quad$}${\land}\; \textit{level}~(\textit{right}~u) < k)$''
 | |
| 33191 | 1714 | \postw | 
| 1715 | ||
| 1716 | Rebalancing the tree upon insertion and removal of elements is performed by two | |
| 1717 | auxiliary functions called \textit{skew} and \textit{split}, defined below:
 | |
| 1718 | ||
| 1719 | \prew | |
| 1720 | \textbf{primrec} \textit{skew} \textbf{where} \\
 | |
| 1721 | ``$\textit{skew}~\Lambda = \Lambda$'' $\,\mid$ \\
 | |
| 1722 | ``$\textit{skew}~(N~x~k~t~u) = {}$ \\
 | |
| 1723 | \phantom{``}$(\textrm{if}~t \not= \Lambda \mathrel{\land} k =
 | |
| 1724 | \textit{level}~t~\textrm{then}$ \\
 | |
| 1725 | \phantom{``(\quad}$N~(\textit{data}~t)~k~(\textit{left}~t)~(N~x~k~
 | |
| 1726 | (\textit{right}~t)~u)$ \\
 | |
| 1727 | \phantom{``(}$\textrm{else}$ \\
 | |
| 1728 | \phantom{``(\quad}$N~x~k~t~u)$''
 | |
| 1729 | \postw | |
| 1730 | ||
| 1731 | \prew | |
| 1732 | \textbf{primrec} \textit{split} \textbf{where} \\
 | |
| 1733 | ``$\textit{split}~\Lambda = \Lambda$'' $\,\mid$ \\
 | |
| 1734 | ``$\textit{split}~(N~x~k~t~u) = {}$ \\
 | |
| 1735 | \phantom{``}$(\textrm{if}~u \not= \Lambda \mathrel{\land} k =
 | |
| 1736 | \textit{level}~(\textit{right}~u)~\textrm{then}$ \\
 | |
| 1737 | \phantom{``(\quad}$N~(\textit{data}~u)~(\textit{Suc}~k)~
 | |
| 1738 | (N~x~k~t~(\textit{left}~u))~(\textit{right}~u)$ \\
 | |
| 1739 | \phantom{``(}$\textrm{else}$ \\
 | |
| 1740 | \phantom{``(\quad}$N~x~k~t~u)$''
 | |
| 1741 | \postw | |
| 1742 | ||
| 1743 | Performing a \textit{skew} or a \textit{split} should have no impact on the set
 | |
| 1744 | of elements stored in the tree: | |
| 1745 | ||
| 1746 | \prew | |
| 35284 
9edc2bd6d2bd
enabled Nitpick's support for quotient types + shortened the Nitpick tests a bit
 blanchet parents: 
35220diff
changeset | 1747 | \textbf{theorem}~\textit{dataset\_skew\_split\/}:\\
 | 
| 33191 | 1748 | ``$\textit{dataset}~(\textit{skew}~t) = \textit{dataset}~t$'' \\
 | 
| 1749 | ``$\textit{dataset}~(\textit{split}~t) = \textit{dataset}~t$'' \\
 | |
| 1750 | \textbf{nitpick} \\[2\smallskipamount]
 | |
| 38183 | 1751 | {\slshape Nitpick ran out of time after checking 9 of 10 scopes.}
 | 
| 33191 | 1752 | \postw | 
| 1753 | ||
| 1754 | Furthermore, applying \textit{skew} or \textit{split} to a well-formed tree
 | |
| 1755 | should not alter the tree: | |
| 1756 | ||
| 1757 | \prew | |
| 35284 
9edc2bd6d2bd
enabled Nitpick's support for quotient types + shortened the Nitpick tests a bit
 blanchet parents: 
35220diff
changeset | 1758 | \textbf{theorem}~\textit{wf\_skew\_split\/}:\\
 | 
| 33191 | 1759 | ``$\textit{wf}~t\,\Longrightarrow\, \textit{skew}~t = t$'' \\
 | 
| 1760 | ``$\textit{wf}~t\,\Longrightarrow\, \textit{split}~t = t$'' \\
 | |
| 1761 | \textbf{nitpick} \\[2\smallskipamount]
 | |
| 1762 | {\slshape Nitpick found no counterexample.}
 | |
| 1763 | \postw | |
| 1764 | ||
| 1765 | Insertion is implemented recursively. It preserves the sort order: | |
| 1766 | ||
| 1767 | \prew | |
| 1768 | \textbf{primrec}~\textit{insort} \textbf{where} \\
 | |
| 1769 | ``$\textit{insort}~\Lambda~x = N~x~1~\Lambda~\Lambda$'' $\,\mid$ \\
 | |
| 1770 | ``$\textit{insort}~(N~y~k~t~u)~x =$ \\
 | |
| 1771 | \phantom{``}$({*}~(\textit{split} \circ \textit{skew})~{*})~(N~y~k~(\textrm{if}~x < y~\textrm{then}~\textit{insort}~t~x~\textrm{else}~t)$ \\
 | |
| 1772 | \phantom{``$({*}~(\textit{split} \circ \textit{skew})~{*})~(N~y~k~$}$(\textrm{if}~x > y~\textrm{then}~\textit{insort}~u~x~\textrm{else}~u))$''
 | |
| 1773 | \postw | |
| 1774 | ||
| 1775 | Notice that we deliberately commented out the application of \textit{skew} and
 | |
| 1776 | \textit{split}. Let's see if this causes any problems:
 | |
| 1777 | ||
| 1778 | \prew | |
| 35284 
9edc2bd6d2bd
enabled Nitpick's support for quotient types + shortened the Nitpick tests a bit
 blanchet parents: 
35220diff
changeset | 1779 | \textbf{theorem}~\textit{wf\_insort\/}:\kern.4em ``$\textit{wf}~t\,\Longrightarrow\, \textit{wf}~(\textit{insort}~t~x)$'' \\
 | 
| 33191 | 1780 | \textbf{nitpick} \\[2\smallskipamount]
 | 
| 1781 | \slshape Nitpick found a counterexample for \textit{card} $'a$ = 4: \\[2\smallskipamount]
 | |
| 1782 | \hbox{}\qquad Free variables: \nopagebreak \\
 | |
| 35078 
6fd1052fe463
optimization to quantifiers in Nitpick's handling of simp rules + renamed some SAT solvers
 blanchet parents: 
35072diff
changeset | 1783 | \hbox{}\qquad\qquad $t = N~a_1~1~\Lambda~\Lambda$ \\
 | 
| 
6fd1052fe463
optimization to quantifiers in Nitpick's handling of simp rules + renamed some SAT solvers
 blanchet parents: 
35072diff
changeset | 1784 | \hbox{}\qquad\qquad $x = a_2$
 | 
| 33191 | 1785 | \postw | 
| 1786 | ||
| 34038 
a2736debeabd
make Nitpick output the message "Hint: Maybe you forgot a type constraint?" only for syntactic classes
 blanchet parents: 
33887diff
changeset | 1787 | It's hard to see why this is a counterexample. To improve readability, we will | 
| 
a2736debeabd
make Nitpick output the message "Hint: Maybe you forgot a type constraint?" only for syntactic classes
 blanchet parents: 
33887diff
changeset | 1788 | restrict the theorem to \textit{nat}, so that we don't need to look up the value
 | 
| 
a2736debeabd
make Nitpick output the message "Hint: Maybe you forgot a type constraint?" only for syntactic classes
 blanchet parents: 
33887diff
changeset | 1789 | of the $\textit{op}~{<}$ constant to find out which element is smaller than the
 | 
| 
a2736debeabd
make Nitpick output the message "Hint: Maybe you forgot a type constraint?" only for syntactic classes
 blanchet parents: 
33887diff
changeset | 1790 | other. In addition, we will tell Nitpick to display the value of | 
| 
a2736debeabd
make Nitpick output the message "Hint: Maybe you forgot a type constraint?" only for syntactic classes
 blanchet parents: 
33887diff
changeset | 1791 | $\textit{insort}~t~x$ using the \textit{eval} option. This gives
 | 
| 33191 | 1792 | |
| 1793 | \prew | |
| 35284 
9edc2bd6d2bd
enabled Nitpick's support for quotient types + shortened the Nitpick tests a bit
 blanchet parents: 
35220diff
changeset | 1794 | \textbf{theorem} \textit{wf\_insort\_nat\/}:\kern.4em ``$\textit{wf}~t\,\Longrightarrow\, \textit{wf}~(\textit{insort}~t~(x\Colon\textit{nat}))$'' \\
 | 
| 33191 | 1795 | \textbf{nitpick} [\textit{eval} = ``$\textit{insort}~t~x$''] \\[2\smallskipamount]
 | 
| 1796 | \slshape Nitpick found a counterexample: \\[2\smallskipamount] | |
| 1797 | \hbox{}\qquad Free variables: \nopagebreak \\
 | |
| 1798 | \hbox{}\qquad\qquad $t = N~1~1~\Lambda~\Lambda$ \\
 | |
| 1799 | \hbox{}\qquad\qquad $x = 0$ \\
 | |
| 1800 | \hbox{}\qquad Evaluated term: \\
 | |
| 1801 | \hbox{}\qquad\qquad $\textit{insort}~t~x = N~1~1~(N~0~1~\Lambda~\Lambda)~\Lambda$
 | |
| 1802 | \postw | |
| 1803 | ||
| 1804 | Nitpick's output reveals that the element $0$ was added as a left child of $1$, | |
| 1805 | where both have a level of 1. This violates the second AA tree invariant, which | |
| 1806 | states that a left child's level must be less than its parent's. This shouldn't | |
| 1807 | come as a surprise, considering that we commented out the tree rebalancing code. | |
| 1808 | Reintroducing the code seems to solve the problem: | |
| 1809 | ||
| 1810 | \prew | |
| 35284 
9edc2bd6d2bd
enabled Nitpick's support for quotient types + shortened the Nitpick tests a bit
 blanchet parents: 
35220diff
changeset | 1811 | \textbf{theorem}~\textit{wf\_insort\/}:\kern.4em ``$\textit{wf}~t\,\Longrightarrow\, \textit{wf}~(\textit{insort}~t~x)$'' \\
 | 
| 33191 | 1812 | \textbf{nitpick} \\[2\smallskipamount]
 | 
| 38183 | 1813 | {\slshape Nitpick ran out of time after checking 8 of 10 scopes.}
 | 
| 33191 | 1814 | \postw | 
| 1815 | ||
| 1816 | Insertion should transform the set of elements represented by the tree in the | |
| 1817 | obvious way: | |
| 1818 | ||
| 1819 | \prew | |
| 35284 
9edc2bd6d2bd
enabled Nitpick's support for quotient types + shortened the Nitpick tests a bit
 blanchet parents: 
35220diff
changeset | 1820 | \textbf{theorem} \textit{dataset\_insort\/}:\kern.4em
 | 
| 33191 | 1821 | ``$\textit{dataset}~(\textit{insort}~t~x) = \{x\} \cup \textit{dataset}~t$'' \\
 | 
| 1822 | \textbf{nitpick} \\[2\smallskipamount]
 | |
| 38183 | 1823 | {\slshape Nitpick ran out of time after checking 7 of 10 scopes.}
 | 
| 33191 | 1824 | \postw | 
| 1825 | ||
| 35072 
d79308423aea
optimize Nitpick's encoding for other datatypes than list that have a constant constructor like "Nil";
 blanchet parents: 
34998diff
changeset | 1826 | We could continue like this and sketch a complete theory of AA trees. Once the | 
| 
d79308423aea
optimize Nitpick's encoding for other datatypes than list that have a constant constructor like "Nil";
 blanchet parents: 
34998diff
changeset | 1827 | definitions and main theorems are in place and have been thoroughly tested using | 
| 
d79308423aea
optimize Nitpick's encoding for other datatypes than list that have a constant constructor like "Nil";
 blanchet parents: 
34998diff
changeset | 1828 | Nitpick, we could start working on the proofs. Developing theories this way | 
| 
d79308423aea
optimize Nitpick's encoding for other datatypes than list that have a constant constructor like "Nil";
 blanchet parents: 
34998diff
changeset | 1829 | usually saves time, because faulty theorems and definitions are discovered much | 
| 
d79308423aea
optimize Nitpick's encoding for other datatypes than list that have a constant constructor like "Nil";
 blanchet parents: 
34998diff
changeset | 1830 | earlier in the process. | 
| 33191 | 1831 | |
| 1832 | \section{Option Reference}
 | |
| 1833 | \label{option-reference}
 | |
| 1834 | ||
| 1835 | \def\flushitem#1{\item[]\noindent\kern-\leftmargin \textbf{#1}}
 | |
| 1836 | \def\qty#1{$\left<\textit{#1}\right>$}
 | |
| 1837 | \def\qtybf#1{$\mathbf{\left<\textbf{\textit{#1}}\right>}$}
 | |
| 1838 | \def\optrue#1#2{\flushitem{\textit{#1} $\bigl[$= \qtybf{bool}$\bigr]$\quad [\textit{true}]\hfill (neg.: \textit{#2})}\nopagebreak\\[\parskip]}
 | |
| 1839 | \def\opfalse#1#2{\flushitem{\textit{#1} $\bigl[$= \qtybf{bool}$\bigr]$\quad [\textit{false}]\hfill (neg.: \textit{#2})}\nopagebreak\\[\parskip]}
 | |
| 1840 | \def\opsmart#1#2{\flushitem{\textit{#1} $\bigl[$= \qtybf{bool\_or\_smart}$\bigr]$\quad [\textit{smart}]\hfill (neg.: \textit{#2})}\nopagebreak\\[\parskip]}
 | |
| 34982 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1841 | \def\opnodefault#1#2{\flushitem{\textit{#1} = \qtybf{#2}} \nopagebreak\\[\parskip]}
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1842 | \def\opdefault#1#2#3{\flushitem{\textit{#1} = \qtybf{#2}\quad [\textit{#3}]} \nopagebreak\\[\parskip]}
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1843 | \def\oparg#1#2#3{\flushitem{\textit{#1} \qtybf{#2} = \qtybf{#3}} \nopagebreak\\[\parskip]}
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1844 | \def\opargbool#1#2#3{\flushitem{\textit{#1} \qtybf{#2} $\bigl[$= \qtybf{bool}$\bigr]$\hfill (neg.: \textit{#3})}\nopagebreak\\[\parskip]}
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1845 | \def\opargboolorsmart#1#2#3{\flushitem{\textit{#1} \qtybf{#2} $\bigl[$= \qtybf{bool\_or\_smart}$\bigr]$\hfill (neg.: \textit{#3})}\nopagebreak\\[\parskip]}
 | 
| 33191 | 1846 | |
| 1847 | Nitpick's behavior can be influenced by various options, which can be specified | |
| 1848 | in brackets after the \textbf{nitpick} command. Default values can be set
 | |
| 1849 | using \textbf{nitpick\_\allowbreak params}. For example:
 | |
| 1850 | ||
| 1851 | \prew | |
| 1852 | \textbf{nitpick\_params} [\textit{verbose}, \,\textit{timeout} = 60$\,s$]
 | |
| 1853 | \postw | |
| 1854 | ||
| 1855 | The options are categorized as follows:\ mode of operation | |
| 1856 | (\S\ref{mode-of-operation}), scope of search (\S\ref{scope-of-search}), output
 | |
| 1857 | format (\S\ref{output-format}), automatic counterexample checks
 | |
| 1858 | (\S\ref{authentication}), optimizations
 | |
| 1859 | (\S\ref{optimizations}), and timeouts (\S\ref{timeouts}).
 | |
| 1860 | ||
| 33561 
ab01b72715ef
introduced Auto Nitpick in addition to Auto Quickcheck;
 blanchet parents: 
33559diff
changeset | 1861 | You can instruct Nitpick to run automatically on newly entered theorems by | 
| 
ab01b72715ef
introduced Auto Nitpick in addition to Auto Quickcheck;
 blanchet parents: 
33559diff
changeset | 1862 | enabling the ``Auto Nitpick'' option from the ``Isabelle'' menu in Proof | 
| 39317 | 1863 | General. For automatic runs, \textit{user\_axioms} (\S\ref{mode-of-operation}),
 | 
| 1864 | \textit{assms} (\S\ref{mode-of-operation}), and \textit{mono}
 | |
| 1865 | (\S\ref{scope-of-search}) are implicitly enabled, \textit{blocking}
 | |
| 1866 | (\S\ref{mode-of-operation}), \textit{verbose} (\S\ref{output-format}), and
 | |
| 1867 | \textit{debug} (\S\ref{output-format}) are disabled, \textit{max\_threads}
 | |
| 1868 | (\S\ref{optimizations}) is taken to be 1, \textit{max\_potential}
 | |
| 1869 | (\S\ref{output-format}) is taken to be 0, and \textit{timeout}
 | |
| 1870 | (\S\ref{timeouts}) is superseded by the ``Auto Tools Time Limit'' in
 | |
| 1871 | Proof General's ``Isabelle'' menu. Nitpick's output is also more concise. | |
| 33561 
ab01b72715ef
introduced Auto Nitpick in addition to Auto Quickcheck;
 blanchet parents: 
33559diff
changeset | 1872 | |
| 33191 | 1873 | The number of options can be overwhelming at first glance. Do not let that worry | 
| 1874 | you: Nitpick's defaults have been chosen so that it almost always does the right | |
| 1875 | thing, and the most important options have been covered in context in | |
| 35712 
77aa29bf14ee
added a mechanism to Nitpick to support custom rendering of terms, and used it for multisets
 blanchet parents: 
35710diff
changeset | 1876 | \S\ref{first-steps}.
 | 
| 33191 | 1877 | |
| 1878 | The descriptions below refer to the following syntactic quantities: | |
| 1879 | ||
| 1880 | \begin{enum}
 | |
| 1881 | \item[$\bullet$] \qtybf{string}: A string.
 | |
| 37259 | 1882 | \item[$\bullet$] \qtybf{string\_list\/}: A space-separated list of strings
 | 
| 1883 | (e.g., ``\textit{ichi ni san}'').
 | |
| 35284 
9edc2bd6d2bd
enabled Nitpick's support for quotient types + shortened the Nitpick tests a bit
 blanchet parents: 
35220diff
changeset | 1884 | \item[$\bullet$] \qtybf{bool\/}: \textit{true} or \textit{false}.
 | 
| 
9edc2bd6d2bd
enabled Nitpick's support for quotient types + shortened the Nitpick tests a bit
 blanchet parents: 
35220diff
changeset | 1885 | \item[$\bullet$] \qtybf{bool\_or\_smart\/}: \textit{true}, \textit{false}, or \textit{smart}.
 | 
| 
9edc2bd6d2bd
enabled Nitpick's support for quotient types + shortened the Nitpick tests a bit
 blanchet parents: 
35220diff
changeset | 1886 | \item[$\bullet$] \qtybf{int\/}: An integer. Negative integers are prefixed with a hyphen.
 | 
| 
9edc2bd6d2bd
enabled Nitpick's support for quotient types + shortened the Nitpick tests a bit
 blanchet parents: 
35220diff
changeset | 1887 | \item[$\bullet$] \qtybf{int\_or\_smart\/}: An integer or \textit{smart}.
 | 
| 33191 | 1888 | \item[$\bullet$] \qtybf{int\_range}: An integer (e.g., 3) or a range
 | 
| 1889 | of nonnegative integers (e.g., $1$--$4$). The range symbol `--' can be entered as \texttt{-} (hyphen) or \texttt{\char`\\\char`\<midarrow\char`\>}.
 | |
| 1890 | ||
| 1891 | \item[$\bullet$] \qtybf{int\_seq}: A comma-separated sequence of ranges of integers (e.g.,~1{,}3{,}\allowbreak6--8).
 | |
| 1892 | \item[$\bullet$] \qtybf{time}: An integer followed by $\textit{min}$ (minutes), $s$ (seconds), or \textit{ms}
 | |
| 1893 | (milliseconds), or the keyword \textit{none} ($\infty$ years).
 | |
| 35284 
9edc2bd6d2bd
enabled Nitpick's support for quotient types + shortened the Nitpick tests a bit
 blanchet parents: 
35220diff
changeset | 1894 | \item[$\bullet$] \qtybf{const\/}: The name of a HOL constant.
 | 
| 33191 | 1895 | \item[$\bullet$] \qtybf{term}: A HOL term (e.g., ``$f~x$'').
 | 
| 35284 
9edc2bd6d2bd
enabled Nitpick's support for quotient types + shortened the Nitpick tests a bit
 blanchet parents: 
35220diff
changeset | 1896 | \item[$\bullet$] \qtybf{term\_list\/}: A space-separated list of HOL terms (e.g.,
 | 
| 33191 | 1897 | ``$f~x$''~``$g~y$''). | 
| 1898 | \item[$\bullet$] \qtybf{type}: A HOL type.
 | |
| 1899 | \end{enum}
 | |
| 1900 | ||
| 1901 | Default values are indicated in square brackets. Boolean options have a negated | |
| 38987 | 1902 | counterpart (e.g., \textit{blocking} vs.\ \textit{non\_blocking}). When setting
 | 
| 33561 
ab01b72715ef
introduced Auto Nitpick in addition to Auto Quickcheck;
 blanchet parents: 
33559diff
changeset | 1903 | Boolean options, ``= \textit{true}'' may be omitted.
 | 
| 33191 | 1904 | |
| 1905 | \subsection{Mode of Operation}
 | |
| 1906 | \label{mode-of-operation}
 | |
| 1907 | ||
| 1908 | \begin{enum}
 | |
| 1909 | \optrue{blocking}{non\_blocking}
 | |
| 1910 | Specifies whether the \textbf{nitpick} command should operate synchronously.
 | |
| 1911 | The asynchronous (non-blocking) mode lets the user start proving the putative | |
| 1912 | theorem while Nitpick looks for a counterexample, but it can also be more | |
| 1913 | confusing. For technical reasons, automatic runs currently always block. | |
| 1914 | ||
| 1915 | \optrue{falsify}{satisfy}
 | |
| 1916 | Specifies whether Nitpick should look for falsifying examples (countermodels) or | |
| 1917 | satisfying examples (models). This manual assumes throughout that | |
| 1918 | \textit{falsify} is enabled.
 | |
| 1919 | ||
| 1920 | \opsmart{user\_axioms}{no\_user\_axioms}
 | |
| 1921 | Specifies whether the user-defined axioms (specified using | |
| 1922 | \textbf{axiomatization} and \textbf{axioms}) should be considered. If the option
 | |
| 1923 | is set to \textit{smart}, Nitpick performs an ad hoc axiom selection based on
 | |
| 1924 | the constants that occur in the formula to falsify. The option is implicitly set | |
| 1925 | to \textit{true} for automatic runs.
 | |
| 1926 | ||
| 1927 | \textbf{Warning:} If the option is set to \textit{true}, Nitpick might
 | |
| 1928 | nonetheless ignore some polymorphic axioms. Counterexamples generated under | |
| 35695 | 1929 | these conditions are tagged as ``quasi genuine.'' The \textit{debug}
 | 
| 33191 | 1930 | (\S\ref{output-format}) option can be used to find out which axioms were
 | 
| 1931 | considered. | |
| 1932 | ||
| 1933 | \nopagebreak | |
| 33561 
ab01b72715ef
introduced Auto Nitpick in addition to Auto Quickcheck;
 blanchet parents: 
33559diff
changeset | 1934 | {\small See also \textit{assms} (\S\ref{mode-of-operation}) and \textit{debug}
 | 
| 
ab01b72715ef
introduced Auto Nitpick in addition to Auto Quickcheck;
 blanchet parents: 
33559diff
changeset | 1935 | (\S\ref{output-format}).}
 | 
| 33191 | 1936 | |
| 1937 | \optrue{assms}{no\_assms}
 | |
| 35331 | 1938 | Specifies whether the relevant assumptions in structured proofs should be | 
| 33191 | 1939 | considered. The option is implicitly enabled for automatic runs. | 
| 1940 | ||
| 1941 | \nopagebreak | |
| 33561 
ab01b72715ef
introduced Auto Nitpick in addition to Auto Quickcheck;
 blanchet parents: 
33559diff
changeset | 1942 | {\small See also \textit{user\_axioms} (\S\ref{mode-of-operation}).}
 | 
| 33191 | 1943 | |
| 1944 | \opfalse{overlord}{no\_overlord}
 | |
| 1945 | Specifies whether Nitpick should put its temporary files in | |
| 1946 | \texttt{\$ISABELLE\_\allowbreak HOME\_\allowbreak USER}, which is useful for
 | |
| 1947 | debugging Nitpick but also unsafe if several instances of the tool are run | |
| 34998 | 1948 | simultaneously. The files are identified by the extensions | 
| 1949 | \texttt{.kki}, \texttt{.cnf}, \texttt{.out}, and
 | |
| 1950 | \texttt{.err}; you may safely remove them after Nitpick has run.
 | |
| 33191 | 1951 | |
| 1952 | \nopagebreak | |
| 1953 | {\small See also \textit{debug} (\S\ref{output-format}).}
 | |
| 1954 | \end{enum}
 | |
| 1955 | ||
| 1956 | \subsection{Scope of Search}
 | |
| 1957 | \label{scope-of-search}
 | |
| 1958 | ||
| 1959 | \begin{enum}
 | |
| 34982 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1960 | \oparg{card}{type}{int\_seq}
 | 
| 34124 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 1961 | Specifies the sequence of cardinalities to use for a given type. | 
| 33191 | 1962 | For free types, and often also for \textbf{typedecl}'d types, it usually makes
 | 
| 1963 | sense to specify cardinalities as a range of the form \textit{$1$--$n$}.
 | |
| 1964 | ||
| 1965 | \nopagebreak | |
| 35665 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35386diff
changeset | 1966 | {\small See also \textit{box} (\S\ref{scope-of-search}) and \textit{mono}
 | 
| 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35386diff
changeset | 1967 | (\S\ref{scope-of-search}).}
 | 
| 33191 | 1968 | |
| 38181 | 1969 | \opdefault{card}{int\_seq}{$\mathbf{1}$--$\mathbf{10}$}
 | 
| 33191 | 1970 | Specifies the default sequence of cardinalities to use. This can be overridden | 
| 1971 | on a per-type basis using the \textit{card}~\qty{type} option described above.
 | |
| 1972 | ||
| 34982 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1973 | \oparg{max}{const}{int\_seq}
 | 
| 33191 | 1974 | Specifies the sequence of maximum multiplicities to use for a given | 
| 1975 | (co)in\-duc\-tive datatype constructor. A constructor's multiplicity is the | |
| 1976 | number of distinct values that it can construct. Nonsensical values (e.g., | |
| 1977 | \textit{max}~[]~$=$~2) are silently repaired. This option is only available for
 | |
| 1978 | datatypes equipped with several constructors. | |
| 1979 | ||
| 34982 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 1980 | \opnodefault{max}{int\_seq}
 | 
| 33191 | 1981 | Specifies the default sequence of maximum multiplicities to use for | 
| 1982 | (co)in\-duc\-tive datatype constructors. This can be overridden on a per-constructor | |
| 1983 | basis using the \textit{max}~\qty{const} option described above.
 | |
| 1984 | ||
| 34124 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 1985 | \opsmart{binary\_ints}{unary\_ints}
 | 
| 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 1986 | Specifies whether natural numbers and integers should be encoded using a unary | 
| 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 1987 | or binary notation. In unary mode, the cardinality fully specifies the subset | 
| 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 1988 | used to approximate the type. For example: | 
| 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 1989 | % | 
| 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 1990 | $$\hbox{\begin{tabular}{@{}rll@{}}%
 | 
| 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 1991 | \textit{card nat} = 4 & induces & $\{0,\, 1,\, 2,\, 3\}$ \\
 | 
| 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 1992 | \textit{card int} = 4 & induces & $\{-1,\, 0,\, +1,\, +2\}$ \\
 | 
| 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 1993 | \textit{card int} = 5 & induces & $\{-2,\, -1,\, 0,\, +1,\, +2\}.$%
 | 
| 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 1994 | \end{tabular}}$$
 | 
| 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 1995 | % | 
| 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 1996 | In general: | 
| 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 1997 | % | 
| 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 1998 | $$\hbox{\begin{tabular}{@{}rll@{}}%
 | 
| 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 1999 | \textit{card nat} = $K$ & induces & $\{0,\, \ldots,\, K - 1\}$ \\
 | 
| 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 2000 | \textit{card int} = $K$ & induces & $\{-\lceil K/2 \rceil + 1,\, \ldots,\, +\lfloor K/2 \rfloor\}.$%
 | 
| 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 2001 | \end{tabular}}$$
 | 
| 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 2002 | % | 
| 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 2003 | In binary mode, the cardinality specifies the number of distinct values that can | 
| 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 2004 | be constructed. Each of these value is represented by a bit pattern whose length | 
| 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 2005 | is specified by the \textit{bits} (\S\ref{scope-of-search}) option. By default,
 | 
| 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 2006 | Nitpick attempts to choose the more appropriate encoding by inspecting the | 
| 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 2007 | formula at hand, preferring the binary notation for problems involving | 
| 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 2008 | multiplicative operators or large constants. | 
| 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 2009 | |
| 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 2010 | \textbf{Warning:} For technical reasons, Nitpick always reverts to unary for
 | 
| 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 2011 | problems that refer to the types \textit{rat} or \textit{real} or the constants
 | 
| 34126 | 2012 | \textit{Suc}, \textit{gcd}, or \textit{lcm}.
 | 
| 34124 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 2013 | |
| 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 2014 | {\small See also \textit{bits} (\S\ref{scope-of-search}) and
 | 
| 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 2015 | \textit{show\_datatypes} (\S\ref{output-format}).}
 | 
| 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 2016 | |
| 38181 | 2017 | \opdefault{bits}{int\_seq}{$\mathbf{1},\mathbf{2},\mathbf{3},\mathbf{4},\mathbf{6},\mathbf{8},\mathbf{10},\mathbf{12},\mathbf{14},\mathbf{16}$}
 | 
| 34124 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 2018 | Specifies the number of bits to use to represent natural numbers and integers in | 
| 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 2019 | binary, excluding the sign bit. The minimum is 1 and the maximum is 31. | 
| 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 2020 | |
| 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 2021 | {\small See also \textit{binary\_ints} (\S\ref{scope-of-search}).}
 | 
| 
c4628a1dcf75
added support for binary nat/int representation to Nitpick
 blanchet parents: 
34038diff
changeset | 2022 | |
| 34982 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 2023 | \opargboolorsmart{wf}{const}{non\_wf}
 | 
| 33191 | 2024 | Specifies whether the specified (co)in\-duc\-tively defined predicate is | 
| 2025 | well-founded. The option can take the following values: | |
| 2026 | ||
| 2027 | \begin{enum}
 | |
| 36926 | 2028 | \item[$\bullet$] \textbf{\textit{true}:} Tentatively treat the (co)in\-duc\-tive
 | 
| 33191 | 2029 | predicate as if it were well-founded. Since this is generally not sound when the | 
| 35695 | 2030 | predicate is not well-founded, the counterexamples are tagged as ``quasi | 
| 33191 | 2031 | genuine.'' | 
| 2032 | ||
| 36926 | 2033 | \item[$\bullet$] \textbf{\textit{false}:} Treat the (co)in\-duc\-tive predicate
 | 
| 33191 | 2034 | as if it were not well-founded. The predicate is then unrolled as prescribed by | 
| 2035 | the \textit{star\_linear\_preds}, \textit{iter}~\qty{const}, and \textit{iter}
 | |
| 2036 | options. | |
| 2037 | ||
| 36926 | 2038 | \item[$\bullet$] \textbf{\textit{smart}:} Try to prove that the inductive
 | 
| 33191 | 2039 | predicate is well-founded using Isabelle's \textit{lexicographic\_order} and
 | 
| 34982 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 2040 | \textit{size\_change} tactics. If this succeeds (or the predicate occurs with an
 | 
| 38176 | 2041 | appropriate polarity in the formula to falsify), use an efficient fixed-point | 
| 33191 | 2042 | equation as specification of the predicate; otherwise, unroll the predicates | 
| 2043 | according to the \textit{iter}~\qty{const} and \textit{iter} options.
 | |
| 2044 | \end{enum}
 | |
| 2045 | ||
| 2046 | \nopagebreak | |
| 2047 | {\small See also \textit{iter} (\S\ref{scope-of-search}),
 | |
| 2048 | \textit{star\_linear\_preds} (\S\ref{optimizations}), and \textit{tac\_timeout}
 | |
| 2049 | (\S\ref{timeouts}).}
 | |
| 2050 | ||
| 2051 | \opsmart{wf}{non\_wf}
 | |
| 2052 | Specifies the default wellfoundedness setting to use. This can be overridden on | |
| 2053 | a per-predicate basis using the \textit{wf}~\qty{const} option above.
 | |
| 2054 | ||
| 34982 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 2055 | \oparg{iter}{const}{int\_seq}
 | 
| 33191 | 2056 | Specifies the sequence of iteration counts to use when unrolling a given | 
| 2057 | (co)in\-duc\-tive predicate. By default, unrolling is applied for inductive | |
| 2058 | predicates that occur negatively and coinductive predicates that occur | |
| 2059 | positively in the formula to falsify and that cannot be proved to be | |
| 2060 | well-founded, but this behavior is influenced by the \textit{wf} option. The
 | |
| 2061 | iteration counts are automatically bounded by the cardinality of the predicate's | |
| 2062 | domain. | |
| 2063 | ||
| 2064 | {\small See also \textit{wf} (\S\ref{scope-of-search}) and
 | |
| 2065 | \textit{star\_linear\_preds} (\S\ref{optimizations}).}
 | |
| 2066 | ||
| 38181 | 2067 | \opdefault{iter}{int\_seq}{$\mathbf{0{,}1{,}2{,}4{,}8{,}12{,}16{,}20{,}24{,}28}$}
 | 
| 33191 | 2068 | Specifies the sequence of iteration counts to use when unrolling (co)in\-duc\-tive | 
| 2069 | predicates. This can be overridden on a per-predicate basis using the | |
| 2070 | \textit{iter} \qty{const} option above.
 | |
| 2071 | ||
| 38181 | 2072 | \opdefault{bisim\_depth}{int\_seq}{$\mathbf{9}$}
 | 
| 33191 | 2073 | Specifies the sequence of iteration counts to use when unrolling the | 
| 2074 | bisimilarity predicate generated by Nitpick for coinductive datatypes. A value | |
| 2075 | of $-1$ means that no predicate is generated, in which case Nitpick performs an | |
| 2076 | after-the-fact check to see if the known coinductive datatype values are | |
| 2077 | bidissimilar. If two values are found to be bisimilar, the counterexample is | |
| 35695 | 2078 | tagged as ``quasi genuine.'' The iteration counts are automatically bounded by | 
| 33191 | 2079 | the sum of the cardinalities of the coinductive datatypes occurring in the | 
| 2080 | formula to falsify. | |
| 2081 | ||
| 34982 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 2082 | \opargboolorsmart{box}{type}{dont\_box}
 | 
| 33191 | 2083 | Specifies whether Nitpick should attempt to wrap (``box'') a given function or | 
| 2084 | product type in an isomorphic datatype internally. Boxing is an effective mean | |
| 2085 | to reduce the search space and speed up Nitpick, because the isomorphic datatype | |
| 35665 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35386diff
changeset | 2086 | is approximated by a subset of the possible function or pair values. | 
| 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35386diff
changeset | 2087 | Like other drastic optimizations, it can also prevent the discovery of | 
| 33191 | 2088 | counterexamples. The option can take the following values: | 
| 2089 | ||
| 2090 | \begin{enum}
 | |
| 36926 | 2091 | \item[$\bullet$] \textbf{\textit{true}:} Box the specified type whenever
 | 
| 33191 | 2092 | practicable. | 
| 36926 | 2093 | \item[$\bullet$] \textbf{\textit{false}:} Never box the type.
 | 
| 2094 | \item[$\bullet$] \textbf{\textit{smart}:} Box the type only in contexts where it
 | |
| 33191 | 2095 | is likely to help. For example, $n$-tuples where $n > 2$ and arguments to | 
| 2096 | higher-order functions are good candidates for boxing. | |
| 2097 | \end{enum}
 | |
| 2098 | ||
| 2099 | \nopagebreak | |
| 35665 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35386diff
changeset | 2100 | {\small See also \textit{finitize} (\S\ref{scope-of-search}), \textit{verbose}
 | 
| 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35386diff
changeset | 2101 | (\S\ref{output-format}), and \textit{debug} (\S\ref{output-format}).}
 | 
| 33191 | 2102 | |
| 2103 | \opsmart{box}{dont\_box}
 | |
| 2104 | Specifies the default boxing setting to use. This can be overridden on a | |
| 2105 | per-type basis using the \textit{box}~\qty{type} option described above.
 | |
| 2106 | ||
| 35665 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35386diff
changeset | 2107 | \opargboolorsmart{finitize}{type}{dont\_finitize}
 | 
| 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35386diff
changeset | 2108 | Specifies whether Nitpick should attempt to finitize a given type, which can be | 
| 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35386diff
changeset | 2109 | a function type or an infinite ``shallow datatype'' (an infinite datatype whose | 
| 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35386diff
changeset | 2110 | constructors don't appear in the problem). | 
| 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35386diff
changeset | 2111 | |
| 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35386diff
changeset | 2112 | For function types, Nitpick performs a monotonicity analysis to detect functions | 
| 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35386diff
changeset | 2113 | that are constant at all but finitely many points (e.g., finite sets) and treats | 
| 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35386diff
changeset | 2114 | such occurrences specially, thereby increasing the precision. The option can | 
| 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35386diff
changeset | 2115 | then take the following values: | 
| 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35386diff
changeset | 2116 | |
| 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35386diff
changeset | 2117 | \begin{enum}
 | 
| 36926 | 2118 | \item[$\bullet$] \textbf{\textit{false}:} Don't attempt to finitize the type.
 | 
| 2119 | \item[$\bullet$] \textbf{\textit{true}} or \textbf{\textit{smart}:} Finitize the
 | |
| 35665 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35386diff
changeset | 2120 | type wherever possible. | 
| 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35386diff
changeset | 2121 | \end{enum}
 | 
| 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35386diff
changeset | 2122 | |
| 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35386diff
changeset | 2123 | The semantics of the option is somewhat different for infinite shallow | 
| 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35386diff
changeset | 2124 | datatypes: | 
| 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35386diff
changeset | 2125 | |
| 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35386diff
changeset | 2126 | \begin{enum}
 | 
| 36926 | 2127 | \item[$\bullet$] \textbf{\textit{true}:} Finitize the datatype. Since this is
 | 
| 35695 | 2128 | unsound, counterexamples generated under these conditions are tagged as ``quasi | 
| 35665 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35386diff
changeset | 2129 | genuine.'' | 
| 36926 | 2130 | \item[$\bullet$] \textbf{\textit{false}:} Don't attempt to finitize the datatype.
 | 
| 2131 | \item[$\bullet$] \textbf{\textit{smart}:} Perform a monotonicity analysis to
 | |
| 35665 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35386diff
changeset | 2132 | detect whether the datatype can be safely finitized before finitizing it. | 
| 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35386diff
changeset | 2133 | \end{enum}
 | 
| 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35386diff
changeset | 2134 | |
| 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35386diff
changeset | 2135 | Like other drastic optimizations, finitization can sometimes prevent the | 
| 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35386diff
changeset | 2136 | discovery of counterexamples. | 
| 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35386diff
changeset | 2137 | |
| 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35386diff
changeset | 2138 | \nopagebreak | 
| 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35386diff
changeset | 2139 | {\small See also \textit{box} (\S\ref{scope-of-search}), \textit{mono}
 | 
| 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35386diff
changeset | 2140 | (\S\ref{scope-of-search}), \textit{verbose} (\S\ref{output-format}), and
 | 
| 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35386diff
changeset | 2141 | \textit{debug} (\S\ref{output-format}).}
 | 
| 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35386diff
changeset | 2142 | |
| 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35386diff
changeset | 2143 | \opsmart{finitize}{dont\_finitize}
 | 
| 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35386diff
changeset | 2144 | Specifies the default finitization setting to use. This can be overridden on a | 
| 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35386diff
changeset | 2145 | per-type basis using the \textit{finitize}~\qty{type} option described above.
 | 
| 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35386diff
changeset | 2146 | |
| 34982 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 2147 | \opargboolorsmart{mono}{type}{non\_mono}
 | 
| 35665 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35386diff
changeset | 2148 | Specifies whether the given type should be considered monotonic when enumerating | 
| 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35386diff
changeset | 2149 | scopes and finitizing types. If the option is set to \textit{smart}, Nitpick
 | 
| 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35386diff
changeset | 2150 | performs a monotonicity check on the type. Setting this option to \textit{true}
 | 
| 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35386diff
changeset | 2151 | can reduce the number of scopes tried, but it can also diminish the chance of | 
| 39317 | 2152 | finding a counterexample, as demonstrated in \S\ref{scope-monotonicity}. The
 | 
| 2153 | option is implicitly set to \textit{true} for automatic runs.
 | |
| 33191 | 2154 | |
| 2155 | \nopagebreak | |
| 2156 | {\small See also \textit{card} (\S\ref{scope-of-search}),
 | |
| 35665 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35386diff
changeset | 2157 | \textit{finitize} (\S\ref{scope-of-search}),
 | 
| 33556 
cba22e2999d5
renamed Nitpick option "coalesce_type_vars" to "merge_type_vars" (shorter) and cleaned up old hacks that are no longer necessary
 blanchet parents: 
33232diff
changeset | 2158 | \textit{merge\_type\_vars} (\S\ref{scope-of-search}), and \textit{verbose}
 | 
| 33191 | 2159 | (\S\ref{output-format}).}
 | 
| 2160 | ||
| 35665 
ff2bf50505ab
added "finitize" option to Nitpick + remove dependency on "Coinductive_List"
 blanchet parents: 
35386diff
changeset | 2161 | \opsmart{mono}{non\_mono}
 | 
| 33191 | 2162 | Specifies the default monotonicity setting to use. This can be overridden on a | 
| 2163 | per-type basis using the \textit{mono}~\qty{type} option described above.
 | |
| 2164 | ||
| 33556 
cba22e2999d5
renamed Nitpick option "coalesce_type_vars" to "merge_type_vars" (shorter) and cleaned up old hacks that are no longer necessary
 blanchet parents: 
33232diff
changeset | 2165 | \opfalse{merge\_type\_vars}{dont\_merge\_type\_vars}
 | 
| 33191 | 2166 | Specifies whether type variables with the same sort constraints should be | 
| 2167 | merged. Setting this option to \textit{true} can reduce the number of scopes
 | |
| 2168 | tried and the size of the generated Kodkod formulas, but it also diminishes the | |
| 2169 | theoretical chance of finding a counterexample. | |
| 2170 | ||
| 2171 | {\small See also \textit{mono} (\S\ref{scope-of-search}).}
 | |
| 34982 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 2172 | |
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 2173 | \opargbool{std}{type}{non\_std}
 | 
| 35189 
250fe9541fb2
added gotcha to Nitpick manual regarding nonstandard models of "nat"
 blanchet parents: 
35185diff
changeset | 2174 | Specifies whether the given (recursive) datatype should be given standard | 
| 
250fe9541fb2
added gotcha to Nitpick manual regarding nonstandard models of "nat"
 blanchet parents: 
35185diff
changeset | 2175 | models. Nonstandard models are unsound but can help debug structural induction | 
| 
250fe9541fb2
added gotcha to Nitpick manual regarding nonstandard models of "nat"
 blanchet parents: 
35185diff
changeset | 2176 | proofs, as explained in \S\ref{inductive-properties}.
 | 
| 34982 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 2177 | |
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 2178 | \optrue{std}{non\_std}
 | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 2179 | Specifies the default standardness to use. This can be overridden on a per-type | 
| 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 2180 | basis using the \textit{std}~\qty{type} option described above.
 | 
| 33191 | 2181 | \end{enum}
 | 
| 2182 | ||
| 2183 | \subsection{Output Format}
 | |
| 2184 | \label{output-format}
 | |
| 2185 | ||
| 2186 | \begin{enum}
 | |
| 2187 | \opfalse{verbose}{quiet}
 | |
| 2188 | Specifies whether the \textbf{nitpick} command should explain what it does. This
 | |
| 2189 | option is useful to determine which scopes are tried or which SAT solver is | |
| 2190 | used. This option is implicitly disabled for automatic runs. | |
| 2191 | ||
| 2192 | \opfalse{debug}{no\_debug}
 | |
| 2193 | Specifies whether Nitpick should display additional debugging information beyond | |
| 2194 | what \textit{verbose} already displays. Enabling \textit{debug} also enables
 | |
| 2195 | \textit{verbose} and \textit{show\_all} behind the scenes. The \textit{debug}
 | |
| 2196 | option is implicitly disabled for automatic runs. | |
| 2197 | ||
| 2198 | \nopagebreak | |
| 33561 
ab01b72715ef
introduced Auto Nitpick in addition to Auto Quickcheck;
 blanchet parents: 
33559diff
changeset | 2199 | {\small See also \textit{overlord} (\S\ref{mode-of-operation}) and
 | 
| 
ab01b72715ef
introduced Auto Nitpick in addition to Auto Quickcheck;
 blanchet parents: 
33559diff
changeset | 2200 | \textit{batch\_size} (\S\ref{optimizations}).}
 | 
| 33191 | 2201 | |
| 2202 | \opfalse{show\_datatypes}{hide\_datatypes}
 | |
| 2203 | Specifies whether the subsets used to approximate (co)in\-duc\-tive datatypes should | |
| 2204 | be displayed as part of counterexamples. Such subsets are sometimes helpful when | |
| 2205 | investigating whether a potential counterexample is genuine or spurious, but | |
| 2206 | their potential for clutter is real. | |
| 2207 | ||
| 2208 | \opfalse{show\_consts}{hide\_consts}
 | |
| 2209 | Specifies whether the values of constants occurring in the formula (including | |
| 2210 | its axioms) should be displayed along with any counterexample. These values are | |
| 2211 | sometimes helpful when investigating why a counterexample is | |
| 2212 | genuine, but they can clutter the output. | |
| 2213 | ||
| 37169 
f69efa106feb
make Nitpick "show_all" option behave less surprisingly
 blanchet parents: 
36926diff
changeset | 2214 | \opnodefault{show\_all}{bool}
 | 
| 
f69efa106feb
make Nitpick "show_all" option behave less surprisingly
 blanchet parents: 
36926diff
changeset | 2215 | Abbreviation for \textit{show\_datatypes} and \textit{show\_consts}.
 | 
| 33191 | 2216 | |
| 34982 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 2217 | \opdefault{max\_potential}{int}{$\mathbf{1}$}
 | 
| 33191 | 2218 | Specifies the maximum number of potential counterexamples to display. Setting | 
| 2219 | this option to 0 speeds up the search for a genuine counterexample. This option | |
| 2220 | is implicitly set to 0 for automatic runs. If you set this option to a value | |
| 35710 | 2221 | greater than 1, you will need an incremental SAT solver, such as | 
| 2222 | \textit{MiniSat\_JNI} (recommended) and \textit{SAT4J}. Be aware that many of
 | |
| 2223 | the counterexamples may be identical. | |
| 33191 | 2224 | |
| 2225 | \nopagebreak | |
| 33561 
ab01b72715ef
introduced Auto Nitpick in addition to Auto Quickcheck;
 blanchet parents: 
33559diff
changeset | 2226 | {\small See also \textit{check\_potential} (\S\ref{authentication}) and
 | 
| 33191 | 2227 | \textit{sat\_solver} (\S\ref{optimizations}).}
 | 
| 2228 | ||
| 34982 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 2229 | \opdefault{max\_genuine}{int}{$\mathbf{1}$}
 | 
| 33191 | 2230 | Specifies the maximum number of genuine counterexamples to display. If you set | 
| 35710 | 2231 | this option to a value greater than 1, you will need an incremental SAT solver, | 
| 2232 | such as \textit{MiniSat\_JNI} (recommended) and \textit{SAT4J}. Be aware that
 | |
| 2233 | many of the counterexamples may be identical. | |
| 33191 | 2234 | |
| 2235 | \nopagebreak | |
| 2236 | {\small See also \textit{check\_genuine} (\S\ref{authentication}) and
 | |
| 2237 | \textit{sat\_solver} (\S\ref{optimizations}).}
 | |
| 2238 | ||
| 34982 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 2239 | \opnodefault{eval}{term\_list}
 | 
| 33191 | 2240 | Specifies the list of terms whose values should be displayed along with | 
| 2241 | counterexamples. This option suffers from an ``observer effect'': Nitpick might | |
| 2242 | find different counterexamples for different values of this option. | |
| 2243 | ||
| 37259 | 2244 | \oparg{atoms}{type}{string\_list}
 | 
| 2245 | Specifies the names to use to refer to the atoms of the given type. By default, | |
| 2246 | Nitpick generates names of the form $a_1, \ldots, a_n$, where $a$ is the first | |
| 2247 | letter of the type's name. | |
| 2248 | ||
| 2249 | \opnodefault{atoms}{string\_list}
 | |
| 2250 | Specifies the default names to use to refer to atoms of any type. For example, | |
| 2251 | to call the three atoms of type ${'}a$ \textit{ichi}, \textit{ni}, and
 | |
| 2252 | \textit{san} instead of $a_1$, $a_2$, $a_3$, specify the option
 | |
| 2253 | ``\textit{atoms}~${'}a$ = \textit{ichi~ni~san}''. The default names can be
 | |
| 2254 | overridden on a per-type basis using the \textit{atoms}~\qty{type} option
 | |
| 2255 | described above. | |
| 2256 | ||
| 34982 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 2257 | \oparg{format}{term}{int\_seq}
 | 
| 33191 | 2258 | Specifies how to uncurry the value displayed for a variable or constant. | 
| 2259 | Uncurrying sometimes increases the readability of the output for high-arity | |
| 2260 | functions. For example, given the variable $y \mathbin{\Colon} {'a}\Rightarrow
 | |
| 2261 | {'b}\Rightarrow {'c}\Rightarrow {'d}\Rightarrow {'e}\Rightarrow {'f}\Rightarrow
 | |
| 2262 | {'g}$, setting \textit{format}~$y$ = 3 tells Nitpick to group the last three
 | |
| 2263 | arguments, as if the type had been ${'a}\Rightarrow {'b}\Rightarrow
 | |
| 2264 | {'c}\Rightarrow {'d}\times {'e}\times {'f}\Rightarrow {'g}$. In general, a list
 | |
| 2265 | of values $n_1,\ldots,n_k$ tells Nitpick to show the last $n_k$ arguments as an | |
| 2266 | $n_k$-tuple, the previous $n_{k-1}$ arguments as an $n_{k-1}$-tuple, and so on;
 | |
| 2267 | arguments that are not accounted for are left alone, as if the specification had | |
| 2268 | been $1,\ldots,1,n_1,\ldots,n_k$. | |
| 2269 | ||
| 34982 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 2270 | \opdefault{format}{int\_seq}{$\mathbf{1}$}
 | 
| 33191 | 2271 | Specifies the default format to use. Irrespective of the default format, the | 
| 2272 | extra arguments to a Skolem constant corresponding to the outer bound variables | |
| 2273 | are kept separated from the remaining arguments, the \textbf{for} arguments of
 | |
| 2274 | an inductive definitions are kept separated from the remaining arguments, and | |
| 2275 | the iteration counter of an unrolled inductive definition is shown alone. The | |
| 2276 | default format can be overridden on a per-variable or per-constant basis using | |
| 2277 | the \textit{format}~\qty{term} option described above.
 | |
| 2278 | \end{enum}
 | |
| 2279 | ||
| 2280 | \subsection{Authentication}
 | |
| 2281 | \label{authentication}
 | |
| 2282 | ||
| 2283 | \begin{enum}
 | |
| 2284 | \opfalse{check\_potential}{trust\_potential}
 | |
| 2285 | Specifies whether potential counterexamples should be given to Isabelle's | |
| 2286 | \textit{auto} tactic to assess their validity. If a potential counterexample is
 | |
| 2287 | shown to be genuine, Nitpick displays a message to this effect and terminates. | |
| 2288 | ||
| 2289 | \nopagebreak | |
| 33561 
ab01b72715ef
introduced Auto Nitpick in addition to Auto Quickcheck;
 blanchet parents: 
33559diff
changeset | 2290 | {\small See also \textit{max\_potential} (\S\ref{output-format}).}
 | 
| 33191 | 2291 | |
| 2292 | \opfalse{check\_genuine}{trust\_genuine}
 | |
| 35695 | 2293 | Specifies whether genuine and quasi genuine counterexamples should be given to | 
| 33191 | 2294 | Isabelle's \textit{auto} tactic to assess their validity. If a ``genuine''
 | 
| 2295 | counterexample is shown to be spurious, the user is kindly asked to send a bug | |
| 2296 | report to the author at | |
| 2297 | \texttt{blan{\color{white}nospam}\kern-\wd\boxA{}chette@in.tum.de}.
 | |
| 2298 | ||
| 2299 | \nopagebreak | |
| 33561 
ab01b72715ef
introduced Auto Nitpick in addition to Auto Quickcheck;
 blanchet parents: 
33559diff
changeset | 2300 | {\small See also \textit{max\_genuine} (\S\ref{output-format}).}
 | 
| 33191 | 2301 | |
| 34982 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 2302 | \opnodefault{expect}{string}
 | 
| 33191 | 2303 | Specifies the expected outcome, which must be one of the following: | 
| 2304 | ||
| 2305 | \begin{enum}
 | |
| 36926 | 2306 | \item[$\bullet$] \textbf{\textit{genuine}:} Nitpick found a genuine counterexample.
 | 
| 2307 | \item[$\bullet$] \textbf{\textit{quasi\_genuine}:} Nitpick found a ``quasi
 | |
| 33191 | 2308 | genuine'' counterexample (i.e., a counterexample that is genuine unless | 
| 2309 | it contradicts a missing axiom or a dangerous option was used inappropriately). | |
| 36926 | 2310 | \item[$\bullet$] \textbf{\textit{potential}:} Nitpick found a potential counterexample.
 | 
| 2311 | \item[$\bullet$] \textbf{\textit{none}:} Nitpick found no counterexample.
 | |
| 2312 | \item[$\bullet$] \textbf{\textit{unknown}:} Nitpick encountered some problem (e.g.,
 | |
| 33191 | 2313 | Kodkod ran out of memory). | 
| 2314 | \end{enum}
 | |
| 2315 | ||
| 2316 | Nitpick emits an error if the actual outcome differs from the expected outcome. | |
| 2317 | This option is useful for regression testing. | |
| 2318 | \end{enum}
 | |
| 2319 | ||
| 2320 | \subsection{Optimizations}
 | |
| 2321 | \label{optimizations}
 | |
| 2322 | ||
| 2323 | \def\cpp{C\nobreak\raisebox{.1ex}{+}\nobreak\raisebox{.1ex}{+}}
 | |
| 2324 | ||
| 2325 | \sloppy | |
| 2326 | ||
| 2327 | \begin{enum}
 | |
| 34982 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 2328 | \opdefault{sat\_solver}{string}{smart}
 | 
| 33191 | 2329 | Specifies which SAT solver to use. SAT solvers implemented in C or \cpp{} tend
 | 
| 2330 | to be faster than their Java counterparts, but they can be more difficult to | |
| 2331 | install. Also, if you set the \textit{max\_potential} (\S\ref{output-format}) or
 | |
| 2332 | \textit{max\_genuine} (\S\ref{output-format}) option to a value greater than 1,
 | |
| 35078 
6fd1052fe463
optimization to quantifiers in Nitpick's handling of simp rules + renamed some SAT solvers
 blanchet parents: 
35072diff
changeset | 2333 | you will need an incremental SAT solver, such as \textit{MiniSat\_JNI}
 | 
| 33191 | 2334 | (recommended) or \textit{SAT4J}.
 | 
| 2335 | ||
| 2336 | The supported solvers are listed below: | |
| 2337 | ||
| 2338 | \begin{enum}
 | |
| 2339 | ||
| 38125 
b178a63df952
change the order of the SAT solvers, from fastest to slowest
 blanchet parents: 
38123diff
changeset | 2340 | \item[$\bullet$] \textbf{\textit{MiniSat}:} MiniSat is an efficient solver
 | 
| 
b178a63df952
change the order of the SAT solvers, from fastest to slowest
 blanchet parents: 
38123diff
changeset | 2341 | written in \cpp{}. To use MiniSat, set the environment variable
 | 
| 
b178a63df952
change the order of the SAT solvers, from fastest to slowest
 blanchet parents: 
38123diff
changeset | 2342 | \texttt{MINISAT\_HOME} to the directory that contains the \texttt{minisat}
 | 
| 38122 | 2343 | executable.% | 
| 2344 | \footnote{Important note for Cygwin users: The path must be specified using
 | |
| 2345 | native Windows syntax. Make sure to escape backslashes properly.% | |
| 2346 | \label{cygwin-paths}}
 | |
| 35695 | 2347 | The \cpp{} sources and executables for MiniSat are available at
 | 
| 33191 | 2348 | \url{http://minisat.se/MiniSat.html}. Nitpick has been tested with versions 1.14
 | 
| 2349 | and 2.0 beta (2007-07-21). | |
| 2350 | ||
| 36926 | 2351 | \item[$\bullet$] \textbf{\textit{MiniSat\_JNI}:} The JNI (Java Native Interface)
 | 
| 35710 | 2352 | version of MiniSat is bundled with Kodkodi and is precompiled for the major | 
| 2353 | platforms. It is also available from \texttt{native\-solver.\allowbreak tgz},
 | |
| 2354 | which you will find on Kodkod's web site \cite{kodkod-2009}. Unlike the standard
 | |
| 33191 | 2355 | version of MiniSat, the JNI version can be used incrementally. | 
| 2356 | ||
| 38125 
b178a63df952
change the order of the SAT solvers, from fastest to slowest
 blanchet parents: 
38123diff
changeset | 2357 | \item[$\bullet$] \textbf{\textit{CryptoMiniSat}:} CryptoMiniSat is the winner of
 | 
| 
b178a63df952
change the order of the SAT solvers, from fastest to slowest
 blanchet parents: 
38123diff
changeset | 2358 | the 2010 SAT Race. To use CryptoMiniSat, set the environment variable | 
| 
b178a63df952
change the order of the SAT solvers, from fastest to slowest
 blanchet parents: 
38123diff
changeset | 2359 | \texttt{CRYPTO\-MINISAT\_}\discretionary{}{}{}\texttt{HOME} to the directory that contains the \texttt{crypto\-minisat}
 | 
| 
b178a63df952
change the order of the SAT solvers, from fastest to slowest
 blanchet parents: 
38123diff
changeset | 2360 | executable.% | 
| 
b178a63df952
change the order of the SAT solvers, from fastest to slowest
 blanchet parents: 
38123diff
changeset | 2361 | \footref{cygwin-paths}
 | 
| 
b178a63df952
change the order of the SAT solvers, from fastest to slowest
 blanchet parents: 
38123diff
changeset | 2362 | The \cpp{} sources and executables for Crypto\-Mini\-Sat are available at
 | 
| 
b178a63df952
change the order of the SAT solvers, from fastest to slowest
 blanchet parents: 
38123diff
changeset | 2363 | \url{http://planete.inrialpes.fr/~soos/}\allowbreak\url{CryptoMiniSat2/index.php}.
 | 
| 
b178a63df952
change the order of the SAT solvers, from fastest to slowest
 blanchet parents: 
38123diff
changeset | 2364 | Nitpick has been tested with version 2.51. | 
| 
b178a63df952
change the order of the SAT solvers, from fastest to slowest
 blanchet parents: 
38123diff
changeset | 2365 | |
| 36926 | 2366 | \item[$\bullet$] \textbf{\textit{PicoSAT}:} PicoSAT is an efficient solver
 | 
| 33731 
040852c71779
change the order in which Nitpick tries SAT solvers;
 blanchet parents: 
33581diff
changeset | 2367 | written in C. You can install a standard version of | 
| 33191 | 2368 | PicoSAT and set the environment variable \texttt{PICOSAT\_HOME} to the directory
 | 
| 35695 | 2369 | that contains the \texttt{picosat} executable.%
 | 
| 2370 | \footref{cygwin-paths}
 | |
| 2371 | The C sources for PicoSAT are | |
| 33191 | 2372 | available at \url{http://fmv.jku.at/picosat/} and are also bundled with Kodkodi.
 | 
| 2373 | Nitpick has been tested with version 913. | |
| 2374 | ||
| 36926 | 2375 | \item[$\bullet$] \textbf{\textit{zChaff}:} zChaff is an efficient solver written
 | 
| 33191 | 2376 | in \cpp{}. To use zChaff, set the environment variable \texttt{ZCHAFF\_HOME} to
 | 
| 35695 | 2377 | the directory that contains the \texttt{zchaff} executable.%
 | 
| 2378 | \footref{cygwin-paths}
 | |
| 2379 | The \cpp{} sources and executables for zChaff are available at
 | |
| 33191 | 2380 | \url{http://www.princeton.edu/~chaff/zchaff.html}. Nitpick has been tested with
 | 
| 2381 | versions 2004-05-13, 2004-11-15, and 2007-03-12. | |
| 2382 | ||
| 36926 | 2383 | \item[$\bullet$] \textbf{\textit{zChaff\_JNI}:} The JNI version of zChaff is
 | 
| 35710 | 2384 | bundled with Kodkodi and is precompiled for the major | 
| 2385 | platforms. It is also available from \texttt{native\-solver.\allowbreak tgz},
 | |
| 2386 | which you will find on Kodkod's web site \cite{kodkod-2009}.
 | |
| 33191 | 2387 | |
| 36926 | 2388 | \item[$\bullet$] \textbf{\textit{RSat}:} RSat is an efficient solver written in
 | 
| 33191 | 2389 | \cpp{}. To use RSat, set the environment variable \texttt{RSAT\_HOME} to the
 | 
| 35695 | 2390 | directory that contains the \texttt{rsat} executable.%
 | 
| 2391 | \footref{cygwin-paths}
 | |
| 2392 | The \cpp{} sources for RSat are available at
 | |
| 2393 | \url{http://reasoning.cs.ucla.edu/rsat/}. Nitpick has been tested with version
 | |
| 2394 | 2.01. | |
| 33191 | 2395 | |
| 36926 | 2396 | \item[$\bullet$] \textbf{\textit{BerkMin}:} BerkMin561 is an efficient solver
 | 
| 33191 | 2397 | written in C. To use BerkMin, set the environment variable | 
| 2398 | \texttt{BERKMIN\_HOME} to the directory that contains the \texttt{BerkMin561}
 | |
| 35695 | 2399 | executable.\footref{cygwin-paths}
 | 
| 2400 | The BerkMin executables are available at | |
| 33191 | 2401 | \url{http://eigold.tripod.com/BerkMin.html}.
 | 
| 2402 | ||
| 36926 | 2403 | \item[$\bullet$] \textbf{\textit{BerkMin\_Alloy}:} Variant of BerkMin that is
 | 
| 33191 | 2404 | included with Alloy 4 and calls itself ``sat56'' in its banner text. To use this | 
| 2405 | version of BerkMin, set the environment variable | |
| 2406 | \texttt{BERKMINALLOY\_HOME} to the directory that contains the \texttt{berkmin}
 | |
| 35695 | 2407 | executable.% | 
| 2408 | \footref{cygwin-paths}
 | |
| 33191 | 2409 | |
| 36926 | 2410 | \item[$\bullet$] \textbf{\textit{Jerusat}:} Jerusat 1.3 is an efficient solver
 | 
| 33191 | 2411 | written in C. To use Jerusat, set the environment variable | 
| 2412 | \texttt{JERUSAT\_HOME} to the directory that contains the \texttt{Jerusat1.3}
 | |
| 35695 | 2413 | executable.% | 
| 2414 | \footref{cygwin-paths}
 | |
| 2415 | The C sources for Jerusat are available at | |
| 33191 | 2416 | \url{http://www.cs.tau.ac.il/~ale1/Jerusat1.3.tgz}.
 | 
| 2417 | ||
| 36926 | 2418 | \item[$\bullet$] \textbf{\textit{SAT4J}:} SAT4J is a reasonably efficient solver
 | 
| 33191 | 2419 | written in Java that can be used incrementally. It is bundled with Kodkodi and | 
| 2420 | requires no further installation or configuration steps. Do not attempt to | |
| 2421 | install the official SAT4J packages, because their API is incompatible with | |
| 2422 | Kodkod. | |
| 2423 | ||
| 36926 | 2424 | \item[$\bullet$] \textbf{\textit{SAT4J\_Light}:} Variant of SAT4J that is
 | 
| 33191 | 2425 | optimized for small problems. It can also be used incrementally. | 
| 2426 | ||
| 36926 | 2427 | \item[$\bullet$] \textbf{\textit{smart}:} If \textit{sat\_solver} is set to
 | 
| 38125 
b178a63df952
change the order of the SAT solvers, from fastest to slowest
 blanchet parents: 
38123diff
changeset | 2428 | \textit{smart}, Nitpick selects the first solver among the above that is
 | 
| 
b178a63df952
change the order of the SAT solvers, from fastest to slowest
 blanchet parents: 
38123diff
changeset | 2429 | recognized by Isabelle. If \textit{verbose} (\S\ref{output-format}) is enabled,
 | 
| 
b178a63df952
change the order of the SAT solvers, from fastest to slowest
 blanchet parents: 
38123diff
changeset | 2430 | Nitpick displays which SAT solver was chosen. | 
| 33191 | 2431 | \end{enum}
 | 
| 2432 | \fussy | |
| 2433 | ||
| 34982 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 2434 | \opdefault{batch\_size}{int\_or\_smart}{smart}
 | 
| 33191 | 2435 | Specifies the maximum number of Kodkod problems that should be lumped together | 
| 2436 | when invoking Kodkodi. Each problem corresponds to one scope. Lumping problems | |
| 2437 | together ensures that Kodkodi is launched less often, but it makes the verbose | |
| 2438 | output less readable and is sometimes detrimental to performance. If | |
| 2439 | \textit{batch\_size} is set to \textit{smart}, the actual value used is 1 if
 | |
| 38181 | 2440 | \textit{debug} (\S\ref{output-format}) is set and 50 otherwise.
 | 
| 33191 | 2441 | |
| 2442 | \optrue{destroy\_constrs}{dont\_destroy\_constrs}
 | |
| 2443 | Specifies whether formulas involving (co)in\-duc\-tive datatype constructors should | |
| 2444 | be rewritten to use (automatically generated) discriminators and destructors. | |
| 2445 | This optimization can drastically reduce the size of the Boolean formulas given | |
| 2446 | to the SAT solver. | |
| 2447 | ||
| 2448 | \nopagebreak | |
| 2449 | {\small See also \textit{debug} (\S\ref{output-format}).}
 | |
| 2450 | ||
| 2451 | \optrue{specialize}{dont\_specialize}
 | |
| 2452 | Specifies whether functions invoked with static arguments should be specialized. | |
| 2453 | This optimization can drastically reduce the search space, especially for | |
| 2454 | higher-order functions. | |
| 2455 | ||
| 2456 | \nopagebreak | |
| 2457 | {\small See also \textit{debug} (\S\ref{output-format}) and
 | |
| 2458 | \textit{show\_consts} (\S\ref{output-format}).}
 | |
| 2459 | ||
| 2460 | \optrue{star\_linear\_preds}{dont\_star\_linear\_preds}
 | |
| 2461 | Specifies whether Nitpick should use Kodkod's transitive closure operator to | |
| 2462 | encode non-well-founded ``linear inductive predicates,'' i.e., inductive | |
| 2463 | predicates for which each the predicate occurs in at most one assumption of each | |
| 2464 | introduction rule. Using the reflexive transitive closure is in principle | |
| 2465 | equivalent to setting \textit{iter} to the cardinality of the predicate's
 | |
| 2466 | domain, but it is usually more efficient. | |
| 2467 | ||
| 2468 | {\small See also \textit{wf} (\S\ref{scope-of-search}), \textit{debug}
 | |
| 2469 | (\S\ref{output-format}), and \textit{iter} (\S\ref{scope-of-search}).}
 | |
| 2470 | ||
| 2471 | {\small See also \textit{debug} (\S\ref{output-format}).}
 | |
| 2472 | ||
| 38209 | 2473 | \opnodefault{whack}{term\_list}
 | 
| 2474 | Specifies a list of atomic terms (usually constants, but also free and schematic | |
| 2475 | variables) that should be taken as being $\unk$ (unknown). This can be useful to | |
| 2476 | reduce the size of the Kodkod problem if you can guess in advance that a | |
| 2477 | constant might not be needed to find a countermodel. | |
| 2478 | ||
| 2479 | {\small See also \textit{debug} (\S\ref{output-format}).}
 | |
| 2480 | ||
| 33191 | 2481 | \optrue{peephole\_optim}{no\_peephole\_optim}
 | 
| 2482 | Specifies whether Nitpick should simplify the generated Kodkod formulas using a | |
| 2483 | peephole optimizer. These optimizations can make a significant difference. | |
| 2484 | Unless you are tracking down a bug in Nitpick or distrust the peephole | |
| 2485 | optimizer, you should leave this option enabled. | |
| 2486 | ||
| 38128 | 2487 | \opdefault{datatype\_sym\_break}{int}{5}
 | 
| 2488 | Specifies an upper bound on the number of datatypes for which Nitpick generates | |
| 2489 | symmetry breaking predicates. Symmetry breaking can speed up the SAT solver | |
| 2490 | considerably, especially for unsatisfiable problems, but too much of it can slow | |
| 2491 | it down. | |
| 2492 | ||
| 2493 | \opdefault{kodkod\_sym\_break}{int}{15}
 | |
| 2494 | Specifies an upper bound on the number of relations for which Kodkod generates | |
| 2495 | symmetry breaking predicates. Symmetry breaking can speed up the SAT solver | |
| 2496 | considerably, especially for unsatisfiable problems, but too much of it can slow | |
| 2497 | it down. | |
| 2498 | ||
| 34982 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 2499 | \opdefault{max\_threads}{int}{0}
 | 
| 33191 | 2500 | Specifies the maximum number of threads to use in Kodkod. If this option is set | 
| 2501 | to 0, Kodkod will compute an appropriate value based on the number of processor | |
| 39317 | 2502 | cores available. The option is implicitly set to 1 for automatic runs. | 
| 33191 | 2503 | |
| 2504 | \nopagebreak | |
| 2505 | {\small See also \textit{batch\_size} (\S\ref{optimizations}) and
 | |
| 2506 | \textit{timeout} (\S\ref{timeouts}).}
 | |
| 2507 | \end{enum}
 | |
| 2508 | ||
| 2509 | \subsection{Timeouts}
 | |
| 2510 | \label{timeouts}
 | |
| 2511 | ||
| 2512 | \begin{enum}
 | |
| 34982 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 2513 | \opdefault{timeout}{time}{$\mathbf{30}$ s}
 | 
| 33191 | 2514 | Specifies the maximum amount of time that the \textbf{nitpick} command should
 | 
| 2515 | spend looking for a counterexample. Nitpick tries to honor this constraint as | |
| 2516 | well as it can but offers no guarantees. For automatic runs, | |
| 33561 
ab01b72715ef
introduced Auto Nitpick in addition to Auto Quickcheck;
 blanchet parents: 
33559diff
changeset | 2517 | \textit{timeout} is ignored; instead, Auto Quickcheck and Auto Nitpick share
 | 
| 
ab01b72715ef
introduced Auto Nitpick in addition to Auto Quickcheck;
 blanchet parents: 
33559diff
changeset | 2518 | a time slot whose length is specified by the ``Auto Counterexample Time | 
| 
ab01b72715ef
introduced Auto Nitpick in addition to Auto Quickcheck;
 blanchet parents: 
33559diff
changeset | 2519 | Limit'' option in Proof General. | 
| 33191 | 2520 | |
| 2521 | \nopagebreak | |
| 33561 
ab01b72715ef
introduced Auto Nitpick in addition to Auto Quickcheck;
 blanchet parents: 
33559diff
changeset | 2522 | {\small See also \textit{max\_threads} (\S\ref{optimizations}).}
 | 
| 33191 | 2523 | |
| 34982 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 2524 | \opdefault{tac\_timeout}{time}{$\mathbf{500}$\,ms}
 | 
| 33191 | 2525 | Specifies the maximum amount of time that the \textit{auto} tactic should use
 | 
| 2526 | when checking a counterexample, and similarly that \textit{lexicographic\_order}
 | |
| 34982 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 2527 | and \textit{size\_change} should use when checking whether a (co)in\-duc\-tive
 | 
| 33191 | 2528 | predicate is well-founded. Nitpick tries to honor this constraint as well as it | 
| 2529 | can but offers no guarantees. | |
| 2530 | ||
| 2531 | \nopagebreak | |
| 2532 | {\small See also \textit{wf} (\S\ref{scope-of-search}),
 | |
| 2533 | \textit{check\_potential} (\S\ref{authentication}),
 | |
| 2534 | and \textit{check\_genuine} (\S\ref{authentication}).}
 | |
| 2535 | \end{enum}
 | |
| 2536 | ||
| 2537 | \section{Attribute Reference}
 | |
| 2538 | \label{attribute-reference}
 | |
| 2539 | ||
| 2540 | Nitpick needs to consider the definitions of all constants occurring in a | |
| 2541 | formula in order to falsify it. For constants introduced using the | |
| 2542 | \textbf{definition} command, the definition is simply the associated
 | |
| 2543 | \textit{\_def} axiom. In contrast, instead of using the internal representation
 | |
| 2544 | of functions synthesized by Isabelle's \textbf{primrec}, \textbf{function}, and
 | |
| 2545 | \textbf{nominal\_primrec} packages, Nitpick relies on the more natural
 | |
| 2546 | equational specification entered by the user. | |
| 2547 | ||
| 2548 | Behind the scenes, Isabelle's built-in packages and theories rely on the | |
| 2549 | following attributes to affect Nitpick's behavior: | |
| 2550 | ||
| 36386 
2132f15b366f
Fruhjahrsputz: remove three mostly useless Nitpick options
 blanchet parents: 
36268diff
changeset | 2551 | \begin{enum}
 | 
| 33191 | 2552 | \flushitem{\textit{nitpick\_def}}
 | 
| 2553 | ||
| 2554 | \nopagebreak | |
| 2555 | This attribute specifies an alternative definition of a constant. The | |
| 2556 | alternative definition should be logically equivalent to the constant's actual | |
| 2557 | axiomatic definition and should be of the form | |
| 2558 | ||
| 2559 | \qquad $c~{?}x_1~\ldots~{?}x_n \,\equiv\, t$,
 | |
| 2560 | ||
| 2561 | where ${?}x_1, \ldots, {?}x_n$ are distinct variables and $c$ does not occur in
 | |
| 2562 | $t$. | |
| 2563 | ||
| 2564 | \flushitem{\textit{nitpick\_simp}}
 | |
| 2565 | ||
| 2566 | \nopagebreak | |
| 2567 | This attribute specifies the equations that constitute the specification of a | |
| 38203 | 2568 | constant. The \textbf{primrec}, \textbf{function}, and
 | 
| 2569 | \textbf{nominal\_\allowbreak primrec} packages automatically attach this
 | |
| 2570 | attribute to their \textit{simps} rules. The equations must be of the form
 | |
| 33191 | 2571 | |
| 38201 | 2572 | \qquad $c~t_1~\ldots\ t_n \;\bigl[{=}\; u\bigr]$
 | 
| 2573 | ||
| 2574 | or | |
| 2575 | ||
| 2576 | \qquad $c~t_1~\ldots\ t_n \,\equiv\, u.$ | |
| 33191 | 2577 | |
| 2578 | \flushitem{\textit{nitpick\_psimp}}
 | |
| 2579 | ||
| 2580 | \nopagebreak | |
| 2581 | This attribute specifies the equations that constitute the partial specification | |
| 38203 | 2582 | of a constant. The \textbf{function} package automatically attaches this
 | 
| 2583 | attribute to its \textit{psimps} rules. The conditional equations must be of the
 | |
| 2584 | form | |
| 33191 | 2585 | |
| 38201 | 2586 | \qquad $\lbrakk P_1;\> \ldots;\> P_m\rbrakk \,\Longrightarrow\, c\ t_1\ \ldots\ t_n \;\bigl[{=}\; u\bigr]$
 | 
| 2587 | ||
| 2588 | or | |
| 2589 | ||
| 2590 | \qquad $\lbrakk P_1;\> \ldots;\> P_m\rbrakk \,\Longrightarrow\, c\ t_1\ \ldots\ t_n \,\equiv\, u$. | |
| 33191 | 2591 | |
| 35809 | 2592 | \flushitem{\textit{nitpick\_choice\_spec}}
 | 
| 2593 | ||
| 2594 | \nopagebreak | |
| 2595 | This attribute specifies the (free-form) specification of a constant defined | |
| 2596 | using the \hbox{(\textbf{ax\_})}\allowbreak\textbf{specification} command.
 | |
| 36386 
2132f15b366f
Fruhjahrsputz: remove three mostly useless Nitpick options
 blanchet parents: 
36268diff
changeset | 2597 | \end{enum}
 | 
| 33191 | 2598 | |
| 2599 | When faced with a constant, Nitpick proceeds as follows: | |
| 2600 | ||
| 2601 | \begin{enum}
 | |
| 2602 | \item[1.] If the \textit{nitpick\_simp} set associated with the constant
 | |
| 2603 | is not empty, Nitpick uses these rules as the specification of the constant. | |
| 2604 | ||
| 2605 | \item[2.] Otherwise, if the \textit{nitpick\_psimp} set associated with
 | |
| 2606 | the constant is not empty, it uses these rules as the specification of the | |
| 2607 | constant. | |
| 2608 | ||
| 35809 | 2609 | \item[3.] Otherwise, if the constant was defined using the | 
| 2610 | \hbox{(\textbf{ax\_})}\allowbreak\textbf{specification} command and the
 | |
| 2611 | \textit{nitpick\_choice\_spec} set associated with the constant is not empty, it
 | |
| 2612 | uses these theorems as the specification of the constant. | |
| 2613 | ||
| 38203 | 2614 | \item[4.] Otherwise, it looks up the definition of the constant. If the | 
| 2615 | \textit{nitpick\_def} set associated with the constant is not empty, it uses the
 | |
| 2616 | latest rule added to the set as the definition of the constant; otherwise it | |
| 2617 | uses the actual definition axiom. | |
| 33191 | 2618 | |
| 2619 | \begin{enum}
 | |
| 38203 | 2620 | \item[1.] If the definition is of the form | 
| 33191 | 2621 | |
| 38181 | 2622 | \qquad $c~{?}x_1~\ldots~{?}x_m \,\equiv\, \lambda y_1~\ldots~y_n.\; \textit{lfp}~(\lambda f.\; t)$
 | 
| 2623 | ||
| 2624 | or | |
| 2625 | ||
| 38201 | 2626 | \qquad $c~{?}x_1~\ldots~{?}x_m \,\equiv\, \lambda y_1~\ldots~y_n.\; \textit{gfp}~(\lambda f.\; t).$
 | 
| 38181 | 2627 | |
| 2628 | Nitpick assumes that the definition was made using a (co)inductive package | |
| 2629 | based on the user-specified introduction rules registered in Isabelle's internal | |
| 2630 | \textit{Spec\_Rules} table. The tool uses the introduction rules to ascertain
 | |
| 2631 | whether the definition is well-founded and the definition to generate a | |
| 2632 | fixed-point equation or an unrolled equation. | |
| 38203 | 2633 | |
| 2634 | \item[2.] If the definition is compact enough, the constant is \textsl{unfolded}
 | |
| 2635 | wherever it appears; otherwise, it is defined equationally, as with | |
| 2636 | the \textit{nitpick\_simp} attribute.
 | |
| 33191 | 2637 | \end{enum}
 | 
| 2638 | \end{enum}
 | |
| 2639 | ||
| 2640 | As an illustration, consider the inductive definition | |
| 2641 | ||
| 2642 | \prew | |
| 2643 | \textbf{inductive}~\textit{odd}~\textbf{where} \\
 | |
| 2644 | ``\textit{odd}~1'' $\,\mid$ \\
 | |
| 2645 | ``\textit{odd}~$n\,\Longrightarrow\, \textit{odd}~(\textit{Suc}~(\textit{Suc}~n))$''
 | |
| 2646 | \postw | |
| 2647 | ||
| 37264 
8b931fb51cc6
removed "nitpick_intro" attribute -- Nitpick noew uses Spec_Rules instead
 blanchet parents: 
37259diff
changeset | 2648 | By default, Nitpick uses the \textit{lfp}-based definition in conjunction with
 | 
| 38178 
0cea0125339a
more documentation, based on email discussions with a user
 blanchet parents: 
38177diff
changeset | 2649 | the introduction rules. To override this, you can specify an alternative | 
| 33191 | 2650 | definition as follows: | 
| 2651 | ||
| 2652 | \prew | |
| 38176 | 2653 | \textbf{lemma} $\mathit{odd\_alt\_def}$ [\textit{nitpick\_def}]:\kern.4em ``$\textit{odd}~n \,\equiv\, n~\textrm{mod}~2 = 1$''
 | 
| 33191 | 2654 | \postw | 
| 2655 | ||
| 2656 | Nitpick then expands all occurrences of $\mathit{odd}~n$ to $n~\textrm{mod}~2
 | |
| 38178 
0cea0125339a
more documentation, based on email discussions with a user
 blanchet parents: 
38177diff
changeset | 2657 | = 1$. Alternatively, you can specify an equational specification of the constant: | 
| 33191 | 2658 | |
| 2659 | \prew | |
| 38175 | 2660 | \textbf{lemma} $\mathit{odd\_simp}$ [\textit{nitpick\_simp}]:\kern.4em ``$\textit{odd}~n = (n~\textrm{mod}~2 = 1)$''
 | 
| 33191 | 2661 | \postw | 
| 2662 | ||
| 38176 | 2663 | Such tweaks should be done with great care, because Nitpick will assume that the | 
| 2664 | constant is completely defined by its equational specification. For example, if | |
| 2665 | you make ``$\textit{odd}~(2 * k + 1)$'' a \textit{nitpick\_simp} rule and neglect to provide rules to handle the $2 * k$ case, Nitpick will define
 | |
| 2666 | $\textit{odd}~n$ arbitrarily for even values of $n$. The \textit{debug}
 | |
| 2667 | (\S\ref{output-format}) option is extremely useful to understand what is going
 | |
| 2668 | on when experimenting with \textit{nitpick\_} attributes.
 | |
| 2669 | ||
| 2670 | Because of its internal three-valued logic, Nitpick tends to lose a | |
| 38173 
de6ef87e65b3
document something I explained in an email to a poweruser
 blanchet parents: 
38172diff
changeset | 2671 | lot of precision in the presence of partially specified constants. For example, | 
| 
de6ef87e65b3
document something I explained in an email to a poweruser
 blanchet parents: 
38172diff
changeset | 2672 | |
| 
de6ef87e65b3
document something I explained in an email to a poweruser
 blanchet parents: 
38172diff
changeset | 2673 | \prew | 
| 38176 | 2674 | \textbf{lemma} \textit{odd\_simp} [\textit{nitpick\_simp}]:\kern.4em ``$\textit{odd~x} = \lnot\, \textit{even}~x$''
 | 
| 38173 
de6ef87e65b3
document something I explained in an email to a poweruser
 blanchet parents: 
38172diff
changeset | 2675 | \postw | 
| 
de6ef87e65b3
document something I explained in an email to a poweruser
 blanchet parents: 
38172diff
changeset | 2676 | |
| 
de6ef87e65b3
document something I explained in an email to a poweruser
 blanchet parents: 
38172diff
changeset | 2677 | is superior to | 
| 
de6ef87e65b3
document something I explained in an email to a poweruser
 blanchet parents: 
38172diff
changeset | 2678 | |
| 
de6ef87e65b3
document something I explained in an email to a poweruser
 blanchet parents: 
38172diff
changeset | 2679 | \prew | 
| 38175 | 2680 | \textbf{lemma} \textit{odd\_psimps} [\textit{nitpick\_simp}]: \\
 | 
| 2681 | ``$\textit{even~x} \,\Longrightarrow\, \textit{odd~x} = \textit{False\/}$'' \\
 | |
| 2682 | ``$\lnot\, \textit{even~x} \,\Longrightarrow\, \textit{odd~x} = \textit{True\/}$''
 | |
| 38173 
de6ef87e65b3
document something I explained in an email to a poweruser
 blanchet parents: 
38172diff
changeset | 2683 | \postw | 
| 
de6ef87e65b3
document something I explained in an email to a poweruser
 blanchet parents: 
38172diff
changeset | 2684 | |
| 38203 | 2685 | Because Nitpick sometimes unfolds definitions but never simplification rules, | 
| 2686 | you can ensure that a constant is defined explicitly using the | |
| 2687 | \textit{nitpick\_simp}. For example:
 | |
| 38176 | 2688 | |
| 2689 | \prew | |
| 2690 | \textbf{definition}~\textit{optimum} \textbf{where} [\textit{nitpick\_simp}]: \\
 | |
| 2691 | ``$\textit{optimum}~t =
 | |
| 38178 
0cea0125339a
more documentation, based on email discussions with a user
 blanchet parents: 
38177diff
changeset | 2692 |      (\forall u.\; \textit{consistent}~u \mathrel{\land} \textit{alphabet}~t = \textit{alphabet}~u$ \\
 | 
| 38177 | 2693 | \phantom{``$\textit{optimum}~t = (\forall u.\;$}${\mathrel{\land}}\; \textit{freq}~t = \textit{freq}~u \longrightarrow
 | 
| 38178 
0cea0125339a
more documentation, based on email discussions with a user
 blanchet parents: 
38177diff
changeset | 2694 |          \textit{cost}~t \le \textit{cost}~u)$''
 | 
| 38176 | 2695 | \postw | 
| 33191 | 2696 | |
| 38178 
0cea0125339a
more documentation, based on email discussions with a user
 blanchet parents: 
38177diff
changeset | 2697 | In some rare occasions, you might want to provide an inductive or coinductive | 
| 
0cea0125339a
more documentation, based on email discussions with a user
 blanchet parents: 
38177diff
changeset | 2698 | view on top of an existing constant $c$. The easiest way to achieve this is to | 
| 
0cea0125339a
more documentation, based on email discussions with a user
 blanchet parents: 
38177diff
changeset | 2699 | define a new constant $c'$ (co)inductively. Then prove that $c$ equals $c'$ | 
| 
0cea0125339a
more documentation, based on email discussions with a user
 blanchet parents: 
38177diff
changeset | 2700 | and let Nitpick know about it: | 
| 
0cea0125339a
more documentation, based on email discussions with a user
 blanchet parents: 
38177diff
changeset | 2701 | |
| 
0cea0125339a
more documentation, based on email discussions with a user
 blanchet parents: 
38177diff
changeset | 2702 | \prew | 
| 
0cea0125339a
more documentation, based on email discussions with a user
 blanchet parents: 
38177diff
changeset | 2703 | \textbf{lemma} \textit{c\_alt\_def} [\textit{nitpick\_def}]:\kern.4em ``$c \equiv c'$\kern2pt ''
 | 
| 
0cea0125339a
more documentation, based on email discussions with a user
 blanchet parents: 
38177diff
changeset | 2704 | \postw | 
| 
0cea0125339a
more documentation, based on email discussions with a user
 blanchet parents: 
38177diff
changeset | 2705 | |
| 
0cea0125339a
more documentation, based on email discussions with a user
 blanchet parents: 
38177diff
changeset | 2706 | This ensures that Nitpick will substitute $c'$ for $c$ and use the (co)inductive | 
| 
0cea0125339a
more documentation, based on email discussions with a user
 blanchet parents: 
38177diff
changeset | 2707 | definition. | 
| 
0cea0125339a
more documentation, based on email discussions with a user
 blanchet parents: 
38177diff
changeset | 2708 | |
| 33191 | 2709 | \section{Standard ML Interface}
 | 
| 2710 | \label{standard-ml-interface}
 | |
| 2711 | ||
| 2712 | Nitpick provides a rich Standard ML interface used mainly for internal purposes | |
| 2713 | and debugging. Among the most interesting functions exported by Nitpick are | |
| 2714 | those that let you invoke the tool programmatically and those that let you | |
| 35712 
77aa29bf14ee
added a mechanism to Nitpick to support custom rendering of terms, and used it for multisets
 blanchet parents: 
35710diff
changeset | 2715 | register and unregister custom coinductive datatypes as well as term | 
| 
77aa29bf14ee
added a mechanism to Nitpick to support custom rendering of terms, and used it for multisets
 blanchet parents: 
35710diff
changeset | 2716 | postprocessors. | 
| 33191 | 2717 | |
| 2718 | \subsection{Invocation of Nitpick}
 | |
| 2719 | \label{invocation-of-nitpick}
 | |
| 2720 | ||
| 2721 | The \textit{Nitpick} structure offers the following functions for invoking your
 | |
| 2722 | favorite counterexample generator: | |
| 2723 | ||
| 2724 | \prew | |
| 2725 | $\textbf{val}\,~\textit{pick\_nits\_in\_term} : \\
 | |
| 2726 | \hbox{}\quad\textit{Proof.state} \rightarrow \textit{params} \rightarrow \textit{bool} \rightarrow \textit{term~list} \rightarrow \textit{term} \\
 | |
| 2727 | \hbox{}\quad{\rightarrow}\; \textit{string} * \textit{Proof.state}$ \\
 | |
| 2728 | $\textbf{val}\,~\textit{pick\_nits\_in\_subgoal} : \\
 | |
| 2729 | \hbox{}\quad\textit{Proof.state} \rightarrow \textit{params} \rightarrow \textit{bool} \rightarrow \textit{int} \rightarrow \textit{string} * \textit{Proof.state}$
 | |
| 2730 | \postw | |
| 2731 | ||
| 2732 | The return value is a new proof state paired with an outcome string | |
| 35695 | 2733 | (``genuine'', ``quasi\_genuine'', ``potential'', ``none'', or ``unknown''). The | 
| 33191 | 2734 | \textit{params} type is a large record that lets you set Nitpick's options. The
 | 
| 2735 | current default options can be retrieved by calling the following function | |
| 33232 
f93390060bbe
internal renaming in Nitpick and fixed Kodkodi invokation on Linux;
 blanchet parents: 
33229diff
changeset | 2736 | defined in the \textit{Nitpick\_Isar} structure:
 | 
| 33191 | 2737 | |
| 2738 | \prew | |
| 2739 | $\textbf{val}\,~\textit{default\_params} :\,
 | |
| 2740 | \textit{theory} \rightarrow (\textit{string} * \textit{string})~\textit{list} \rightarrow \textit{params}$
 | |
| 2741 | \postw | |
| 2742 | ||
| 2743 | The second argument lets you override option values before they are parsed and | |
| 2744 | put into a \textit{params} record. Here is an example:
 | |
| 2745 | ||
| 2746 | \prew | |
| 35712 
77aa29bf14ee
added a mechanism to Nitpick to support custom rendering of terms, and used it for multisets
 blanchet parents: 
35710diff
changeset | 2747 | $\textbf{val}\,~\textit{params} = \textit{Nitpick\_Isar.default\_params}~\textit{thy}~[(\textrm{``}\textrm{timeout\/}\textrm{''},\, \textrm{``}\textrm{none}\textrm{''})]$ \\
 | 
| 33191 | 2748 | $\textbf{val}\,~(\textit{outcome},\, \textit{state}') = \textit{Nitpick.pick\_nits\_in\_subgoal}~\begin{aligned}[t]
 | 
| 2749 | & \textit{state}~\textit{params}~\textit{false} \\[-2pt]
 | |
| 2750 | & \textit{subgoal}\end{aligned}$
 | |
| 2751 | \postw | |
| 2752 | ||
| 33557 
107f3df799f6
clean Nitpick's wellfoundedness cache once in a while, to avoid potential memory leak
 blanchet parents: 
33556diff
changeset | 2753 | \let\antiq=\textrm | 
| 
107f3df799f6
clean Nitpick's wellfoundedness cache once in a while, to avoid potential memory leak
 blanchet parents: 
33556diff
changeset | 2754 | |
| 33191 | 2755 | \subsection{Registration of Coinductive Datatypes}
 | 
| 2756 | \label{registration-of-coinductive-datatypes}
 | |
| 2757 | ||
| 2758 | If you have defined a custom coinductive datatype, you can tell Nitpick about | |
| 2759 | it, so that it can use an efficient Kodkod axiomatization similar to the one it | |
| 2760 | uses for lazy lists. The interface for registering and unregistering coinductive | |
| 2761 | datatypes consists of the following pair of functions defined in the | |
| 38241 | 2762 | \textit{Nitpick\_HOL} structure:
 | 
| 33191 | 2763 | |
| 2764 | \prew | |
| 38284 
9f98107ad8b4
use "declaration" instead of "setup" to register Nitpick extensions
 blanchet parents: 
38274diff
changeset | 2765 | $\textbf{val}\,~\textit{register\_codatatype\/} : {}$ \\
 | 
| 
9f98107ad8b4
use "declaration" instead of "setup" to register Nitpick extensions
 blanchet parents: 
38274diff
changeset | 2766 | $\hbox{}\quad\textit{morphism} \rightarrow \textit{typ} \rightarrow \textit{string} \rightarrow (\textit{string} \times \textit{typ})\;\textit{list} \rightarrow \textit{Context.generic} {}$ \\
 | 
| 
9f98107ad8b4
use "declaration" instead of "setup" to register Nitpick extensions
 blanchet parents: 
38274diff
changeset | 2767 | $\hbox{}\quad{\rightarrow}\; \textit{Context.generic}$ \\
 | 
| 
9f98107ad8b4
use "declaration" instead of "setup" to register Nitpick extensions
 blanchet parents: 
38274diff
changeset | 2768 | $\textbf{val}\,~\textit{unregister\_codatatype\/} : {}$ \\
 | 
| 
9f98107ad8b4
use "declaration" instead of "setup" to register Nitpick extensions
 blanchet parents: 
38274diff
changeset | 2769 | $\hbox{}\quad\textit{morphism} \rightarrow \textit{typ} \rightarrow \textit{Context.generic} \rightarrow \textit{Context.generic} {}$
 | 
| 33191 | 2770 | \postw | 
| 2771 | ||
| 2772 | The type $'a~\textit{llist}$ of lazy lists is already registered; had it
 | |
| 2773 | not been, you could have told Nitpick about it by adding the following line | |
| 2774 | to your theory file: | |
| 2775 | ||
| 2776 | \prew | |
| 38284 
9f98107ad8b4
use "declaration" instead of "setup" to register Nitpick extensions
 blanchet parents: 
38274diff
changeset | 2777 | $\textbf{declaration}~\,\{{*}$ \\
 | 
| 
9f98107ad8b4
use "declaration" instead of "setup" to register Nitpick extensions
 blanchet parents: 
38274diff
changeset | 2778 | $\hbox{}\quad\textit{Nitpick\_HOL.register\_codatatype}~@\{\antiq{typ}~``\kern1pt'a~\textit{llist\/}\textrm{''}\}$ \\
 | 
| 38274 | 2779 | $\hbox{}\qquad\quad @\{\antiq{const\_name}~ \textit{llist\_case}\}$ \\
 | 
| 2780 | $\hbox{}\qquad\quad (\textit{map}~\textit{dest\_Const}~[@\{\antiq{term}~\textit{LNil}\},\, @\{\antiq{term}~\textit{LCons}\}])$ \\
 | |
| 38241 | 2781 | ${*}\}$
 | 
| 33191 | 2782 | \postw | 
| 2783 | ||
| 38284 
9f98107ad8b4
use "declaration" instead of "setup" to register Nitpick extensions
 blanchet parents: 
38274diff
changeset | 2784 | The \textit{register\_codatatype} function takes a coinductive datatype, its
 | 
| 
9f98107ad8b4
use "declaration" instead of "setup" to register Nitpick extensions
 blanchet parents: 
38274diff
changeset | 2785 | case function, and the list of its constructors (in addition to the current | 
| 
9f98107ad8b4
use "declaration" instead of "setup" to register Nitpick extensions
 blanchet parents: 
38274diff
changeset | 2786 | morphism and generic proof context). The case function must take its arguments | 
| 
9f98107ad8b4
use "declaration" instead of "setup" to register Nitpick extensions
 blanchet parents: 
38274diff
changeset | 2787 | in the order that the constructors are listed. If no case function with the | 
| 
9f98107ad8b4
use "declaration" instead of "setup" to register Nitpick extensions
 blanchet parents: 
38274diff
changeset | 2788 | correct signature is available, simply pass the empty string. | 
| 33191 | 2789 | |
| 2790 | On the other hand, if your goal is to cripple Nitpick, add the following line to | |
| 2791 | your theory file and try to check a few conjectures about lazy lists: | |
| 2792 | ||
| 2793 | \prew | |
| 38284 
9f98107ad8b4
use "declaration" instead of "setup" to register Nitpick extensions
 blanchet parents: 
38274diff
changeset | 2794 | $\textbf{declaration}~\,\{{*}$ \\
 | 
| 
9f98107ad8b4
use "declaration" instead of "setup" to register Nitpick extensions
 blanchet parents: 
38274diff
changeset | 2795 | $\hbox{}\quad\textit{Nitpick\_HOL.unregister\_codatatype}~@\{\antiq{typ}~``\kern1pt'a~\textit{llist\/}\textrm{''}\}$ \\
 | 
| 38241 | 2796 | ${*}\}$
 | 
| 33191 | 2797 | \postw | 
| 2798 | ||
| 33581 
e1e77265fb1d
added possibility to register datatypes as codatatypes in Nitpick;
 blanchet parents: 
33579diff
changeset | 2799 | Inductive datatypes can be registered as coinductive datatypes, given | 
| 
e1e77265fb1d
added possibility to register datatypes as codatatypes in Nitpick;
 blanchet parents: 
33579diff
changeset | 2800 | appropriate coinductive constructors. However, doing so precludes | 
| 
e1e77265fb1d
added possibility to register datatypes as codatatypes in Nitpick;
 blanchet parents: 
33579diff
changeset | 2801 | the use of the inductive constructors---Nitpick will generate an error if they | 
| 
e1e77265fb1d
added possibility to register datatypes as codatatypes in Nitpick;
 blanchet parents: 
33579diff
changeset | 2802 | are needed. | 
| 
e1e77265fb1d
added possibility to register datatypes as codatatypes in Nitpick;
 blanchet parents: 
33579diff
changeset | 2803 | |
| 35712 
77aa29bf14ee
added a mechanism to Nitpick to support custom rendering of terms, and used it for multisets
 blanchet parents: 
35710diff
changeset | 2804 | \subsection{Registration of Term Postprocessors}
 | 
| 
77aa29bf14ee
added a mechanism to Nitpick to support custom rendering of terms, and used it for multisets
 blanchet parents: 
35710diff
changeset | 2805 | \label{registration-of-term-postprocessors}
 | 
| 
77aa29bf14ee
added a mechanism to Nitpick to support custom rendering of terms, and used it for multisets
 blanchet parents: 
35710diff
changeset | 2806 | |
| 
77aa29bf14ee
added a mechanism to Nitpick to support custom rendering of terms, and used it for multisets
 blanchet parents: 
35710diff
changeset | 2807 | It is possible to change the output of any term that Nitpick considers a | 
| 
77aa29bf14ee
added a mechanism to Nitpick to support custom rendering of terms, and used it for multisets
 blanchet parents: 
35710diff
changeset | 2808 | datatype by registering a term postprocessor. The interface for registering and | 
| 
77aa29bf14ee
added a mechanism to Nitpick to support custom rendering of terms, and used it for multisets
 blanchet parents: 
35710diff
changeset | 2809 | unregistering postprocessors consists of the following pair of functions defined | 
| 38241 | 2810 | in the \textit{Nitpick\_Model} structure:
 | 
| 35712 
77aa29bf14ee
added a mechanism to Nitpick to support custom rendering of terms, and used it for multisets
 blanchet parents: 
35710diff
changeset | 2811 | |
| 
77aa29bf14ee
added a mechanism to Nitpick to support custom rendering of terms, and used it for multisets
 blanchet parents: 
35710diff
changeset | 2812 | \prew | 
| 
77aa29bf14ee
added a mechanism to Nitpick to support custom rendering of terms, and used it for multisets
 blanchet parents: 
35710diff
changeset | 2813 | $\textbf{type}\,~\textit{term\_postprocessor}\,~{=} {}$ \\
 | 
| 
77aa29bf14ee
added a mechanism to Nitpick to support custom rendering of terms, and used it for multisets
 blanchet parents: 
35710diff
changeset | 2814 | $\hbox{}\quad\textit{Proof.context} \rightarrow \textit{string} \rightarrow (\textit{typ} \rightarrow \textit{term~list\/}) \rightarrow \textit{typ} \rightarrow \textit{term} \rightarrow \textit{term}$ \\
 | 
| 38284 
9f98107ad8b4
use "declaration" instead of "setup" to register Nitpick extensions
 blanchet parents: 
38274diff
changeset | 2815 | $\textbf{val}\,~\textit{register\_term\_postprocessor} : {}$ \\
 | 
| 
9f98107ad8b4
use "declaration" instead of "setup" to register Nitpick extensions
 blanchet parents: 
38274diff
changeset | 2816 | $\hbox{}\quad\textit{typ} \rightarrow \textit{term\_postprocessor} \rightarrow \textit{morphism} \rightarrow \textit{Context.generic}$ \\
 | 
| 
9f98107ad8b4
use "declaration" instead of "setup" to register Nitpick extensions
 blanchet parents: 
38274diff
changeset | 2817 | $\hbox{}\quad{\rightarrow}\; \textit{Context.generic}$ \\
 | 
| 
9f98107ad8b4
use "declaration" instead of "setup" to register Nitpick extensions
 blanchet parents: 
38274diff
changeset | 2818 | $\textbf{val}\,~\textit{unregister\_term\_postprocessor} : {}$ \\
 | 
| 
9f98107ad8b4
use "declaration" instead of "setup" to register Nitpick extensions
 blanchet parents: 
38274diff
changeset | 2819 | $\hbox{}\quad\textit{typ} \rightarrow \textit{morphism} \rightarrow \textit{Context.generic} \rightarrow \textit{Context.generic}$
 | 
| 35712 
77aa29bf14ee
added a mechanism to Nitpick to support custom rendering of terms, and used it for multisets
 blanchet parents: 
35710diff
changeset | 2820 | \postw | 
| 
77aa29bf14ee
added a mechanism to Nitpick to support custom rendering of terms, and used it for multisets
 blanchet parents: 
35710diff
changeset | 2821 | |
| 
77aa29bf14ee
added a mechanism to Nitpick to support custom rendering of terms, and used it for multisets
 blanchet parents: 
35710diff
changeset | 2822 | \S\ref{typedefs-quotient-types-records-rationals-and-reals} and
 | 
| 
77aa29bf14ee
added a mechanism to Nitpick to support custom rendering of terms, and used it for multisets
 blanchet parents: 
35710diff
changeset | 2823 | \texttt{src/HOL/Library/Multiset.thy} illustrate this feature in context.
 | 
| 
77aa29bf14ee
added a mechanism to Nitpick to support custom rendering of terms, and used it for multisets
 blanchet parents: 
35710diff
changeset | 2824 | |
| 33191 | 2825 | \section{Known Bugs and Limitations}
 | 
| 2826 | \label{known-bugs-and-limitations}
 | |
| 2827 | ||
| 2828 | Here are the known bugs and limitations in Nitpick at the time of writing: | |
| 2829 | ||
| 2830 | \begin{enum}
 | |
| 2831 | \item[$\bullet$] Underspecified functions defined using the \textbf{primrec},
 | |
| 2832 | \textbf{function}, or \textbf{nominal\_\allowbreak primrec} packages can lead
 | |
| 2833 | Nitpick to generate spurious counterexamples for theorems that refer to values | |
| 2834 | for which the function is not defined. For example: | |
| 2835 | ||
| 2836 | \prew | |
| 2837 | \textbf{primrec} \textit{prec} \textbf{where} \\
 | |
| 2838 | ``$\textit{prec}~(\textit{Suc}~n) = n$'' \\[2\smallskipamount]
 | |
| 2839 | \textbf{lemma} ``$\textit{prec}~0 = \undef$'' \\
 | |
| 2840 | \textbf{nitpick} \\[2\smallskipamount]
 | |
| 2841 | \quad{\slshape Nitpick found a counterexample for \textit{card nat}~= 2: 
 | |
| 2842 | \nopagebreak | |
| 2843 | \\[2\smallskipamount] | |
| 2844 | \hbox{}\qquad Empty assignment} \nopagebreak\\[2\smallskipamount]
 | |
| 34982 
7b8c366e34a2
added support for nonstandard models to Nitpick (based on an idea by Koen Claessen) and did other fixes to Nitpick
 blanchet parents: 
34126diff
changeset | 2845 | \textbf{by}~(\textit{auto simp}:~\textit{prec\_def})
 | 
| 33191 | 2846 | \postw | 
| 2847 | ||
| 38213 
d4cbc80e7271
extend the scope of limitation about nonconservative extensions
 blanchet parents: 
38209diff
changeset | 2848 | Such theorems are generally considered bad style because they rely on the | 
| 
d4cbc80e7271
extend the scope of limitation about nonconservative extensions
 blanchet parents: 
38209diff
changeset | 2849 | internal representation of functions synthesized by Isabelle, an implementation | 
| 33191 | 2850 | detail. | 
| 2851 | ||
| 38207 
792b78e355e7
added support for "Abs_" and "Rep_" functions on quotient types
 blanchet parents: 
38203diff
changeset | 2852 | \item[$\bullet$] Similarly, Nitpick might find spurious counterexamples for | 
| 
792b78e355e7
added support for "Abs_" and "Rep_" functions on quotient types
 blanchet parents: 
38203diff
changeset | 2853 | theorems that rely on the use of the indefinite description operator internally | 
| 
792b78e355e7
added support for "Abs_" and "Rep_" functions on quotient types
 blanchet parents: 
38203diff
changeset | 2854 | by \textbf{specification} and \textbf{quot\_type}.
 | 
| 
792b78e355e7
added support for "Abs_" and "Rep_" functions on quotient types
 blanchet parents: 
38203diff
changeset | 2855 | |
| 38213 
d4cbc80e7271
extend the scope of limitation about nonconservative extensions
 blanchet parents: 
38209diff
changeset | 2856 | \item[$\bullet$] Axioms or definitions that restrict the possible values of the | 
| 
d4cbc80e7271
extend the scope of limitation about nonconservative extensions
 blanchet parents: 
38209diff
changeset | 2857 | \textit{undefined} constant or other partially specified built-in Isabelle
 | 
| 
d4cbc80e7271
extend the scope of limitation about nonconservative extensions
 blanchet parents: 
38209diff
changeset | 2858 | constants (e.g., \textit{Abs\_} and \textit{Rep\_} constants) are in general
 | 
| 
d4cbc80e7271
extend the scope of limitation about nonconservative extensions
 blanchet parents: 
38209diff
changeset | 2859 | ignored. Again, such nonconservative extensions are generally considered bad | 
| 
d4cbc80e7271
extend the scope of limitation about nonconservative extensions
 blanchet parents: 
38209diff
changeset | 2860 | style. | 
| 35811 | 2861 | |
| 33559 | 2862 | \item[$\bullet$] Nitpick maintains a global cache of wellfoundedness conditions, | 
| 33556 
cba22e2999d5
renamed Nitpick option "coalesce_type_vars" to "merge_type_vars" (shorter) and cleaned up old hacks that are no longer necessary
 blanchet parents: 
33232diff
changeset | 2863 | which can become invalid if you change the definition of an inductive predicate | 
| 
cba22e2999d5
renamed Nitpick option "coalesce_type_vars" to "merge_type_vars" (shorter) and cleaned up old hacks that are no longer necessary
 blanchet parents: 
33232diff
changeset | 2864 | that is registered in the cache. To clear the cache, | 
| 
cba22e2999d5
renamed Nitpick option "coalesce_type_vars" to "merge_type_vars" (shorter) and cleaned up old hacks that are no longer necessary
 blanchet parents: 
33232diff
changeset | 2865 | run Nitpick with the \textit{tac\_timeout} option set to a new value (e.g.,
 | 
| 
cba22e2999d5
renamed Nitpick option "coalesce_type_vars" to "merge_type_vars" (shorter) and cleaned up old hacks that are no longer necessary
 blanchet parents: 
33232diff
changeset | 2866 | 501$\,\textit{ms}$).
 | 
| 
cba22e2999d5
renamed Nitpick option "coalesce_type_vars" to "merge_type_vars" (shorter) and cleaned up old hacks that are no longer necessary
 blanchet parents: 
33232diff
changeset | 2867 | |
| 33191 | 2868 | \item[$\bullet$] Nitpick produces spurious counterexamples when invoked after a | 
| 2869 | \textbf{guess} command in a structured proof.
 | |
| 2870 | ||
| 38241 | 2871 | \item[$\bullet$] The \textit{nitpick\_xxx} attributes and the
 | 
| 2872 | \textit{Nitpick\_xxx.register\_yyy} functions can cause havoc if used
 | |
| 2873 | improperly. | |
| 33191 | 2874 | |
| 33579 | 2875 | \item[$\bullet$] Although this has never been observed, arbitrary theorem | 
| 33581 
e1e77265fb1d
added possibility to register datatypes as codatatypes in Nitpick;
 blanchet parents: 
33579diff
changeset | 2876 | morphisms could possibly confuse Nitpick, resulting in spurious counterexamples. | 
| 33579 | 2877 | |
| 35386 
45a4e19d3ebd
more work on the new monotonicity stuff in Nitpick
 blanchet parents: 
35385diff
changeset | 2878 | \item[$\bullet$] All constants, types, free variables, and schematic variables | 
| 
45a4e19d3ebd
more work on the new monotonicity stuff in Nitpick
 blanchet parents: 
35385diff
changeset | 2879 | whose names start with \textit{Nitpick}{.} are reserved for internal use.
 | 
| 33191 | 2880 | \end{enum}
 | 
| 2881 | ||
| 2882 | \let\em=\sl | |
| 2883 | \bibliography{../manual}{}
 | |
| 2884 | \bibliographystyle{abbrv}
 | |
| 2885 | ||
| 2886 | \end{document}
 |