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