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