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