Arithmetic invariant generation: up to v1.0.1, the main invariant generation technique besides the IC3 engine was boolean template-based invariant generation. This technique can discover equalities and implications between predicates over the state variables of the system.
The technique has been extended to arithmetic terms (int and real): Kind 2 can discover equalities and orderings (<=) between arithmetic terms mined from the input system.
The boolean, integer and real template-based invariant generation techniques all come in two flavors: one-state which can only relate terms over the current state, and two-state which can relate terms mentioning the current and the previous state.
Each of them runs as a different process at runtime. By default, only the following are active:
INVGENOS (one-state boolean)
INVGEN (two-state boolean)
INVGENINTOS (one-state integer)
INVGENREALOS (one-state real)
Several features distinct from the actual verification process were introduced in Kind 2 v1.0.0: certification, contract generation, compilation to Rust, and test generation.
These features are now aggregated under the term post-analyses. Most of them have been improved and v1.1.0 introduces a post-analysis: invariant logging. This feature attempts to log strengthening invariants discovered by Kind 2 as a contract.
Silent contract loading attempts to load contracts generated by Kind 2 during previous runs as candidate properties for the current run (see documentation)
Kind 2 v1.0.1
Read files on standard input in Lustre format
Kind 2 v1.0.0
This new version brings many new features and improvements over v0.8 (more than 800 commits).
NB:
Kind 2 now requires OCaml 4.03 or higher
New features:
2-induction: makes Kind 2 react quicker to good strengthening invariants discovered by invariant generation
Assume/guarantee-based contract language with modes as Lustre annotations (see documentation)
specification-checking: before checking a node with a contract, check that the modes from the contract cover all situations allowed by the assumptions (implementation-agnostic mode exhaustiveness)
explores the DAG of activeable modes from the initial state up to a depth
generates witnesses as traces of inputs logged as XML files
compiles the contract as an executable oracle in Rust: reads a sequence of inputs/outputs values for the original node on stdin and prints on stdout the boolean values the different parts of the contract evaluate to
Generation of certificates and proofs: --proof and --certif
produces either SMTLIB-2 certificates or LFSC proofs
distributed with LFSC proof rules for k-induction
requires CVC4, JKind and the LFSC checker for proofs
generate proofs skeletons for potential holes
Support for forward references on nodes, types, constants and contracts
Output and parser for native (internal) transition system format
Contract generation: --contract_gen
Very experimental: the modes generated might not be exhaustive and the check exhaustiveness check might fail
This feature's main goal, for now, is to help users get started with contracts by generating a contract stub partially filled with invariants discovered by invariant generation
Improvements:
Flags are now organized into modules, see --help and --help_of <module>
Mode information (when available) to counterexample output
Optimized invariant generation
Named properties and guarantees
Colored output
No more dependencies on Camlp4
Strict mode to disallow unguarded pre and undefined local variables
Many bug fixes and performance improvements
Added mode information (when available) to counterexample output
Rewrote invariant generation from scratch: much faster now
czmq fixes: there should be no process still running after Kind 2 exits