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