aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Impure/README.md
blob: 2b19d14a304aee8d4a3e717f9e4aaeab3b640d1f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# `Impure`: importing OCaml functions as non-deterministic ones.

The principle of this library is to encode the type `A -> B` of an
OCaml function as a type `A -> ?? B` in Coq, where `?? B` is the type
of an axiomatized monad that can be interpreted as `B -> Prop`.  In
other word, this encoding abstracts an OCaml function as a function
returning a postcondition on its possible results (ie a relation between its
parameter and its result). Side-effects are simply ignored. And
reasoning on such a function is only possible in partial correctness.

See further explanations and examples on [ImpureDemo](https://github.com/boulme/ImpureDemo).

## Credits

[Sylvain Boulmé](mailto:Sylvain.Boulme@univ-grenoble-alpes.fr).

## Code Overview

- [ImpMonads](ImpMonads.v) axioms of "impure computations" and some Coq models of these axioms.

- [ImpConfig](ImpConfig.v) declares the `Impure` monad and defines its extraction.

- [ImpCore](ImpCore.v) defines notations for the `Impure` monad and a `wlp_simplify` tactic (to reason about `Impure` functions in a Hoare-logic style).

- [ImpPrelude](ImpPrelude.v) declares the data types exchanged with `Impure` oracles.

- [ImpIO](ImpIO.v), [ImpLoops](ImpLoops.v), [ImpHCons](ImpHCons.v) declare `Impure` oracles and define operators from these oracles.
  [ImpExtern](ImpExtern.v) exports all these impure operators.

- [ocaml/](ocaml/) subdirectory containing the OCaml implementations of `Impure` oracles.