Coq is a proof assistant based on type theory that can be used to formally verify programs and proofs. It supports program extraction to OCaml and can be used to prove properties of programs written in languages like OCaml, Java, C, and Assembly. Coq has been used to verify high assurance systems like the seL4 microkernel and TLS and JavaCard implementations. Formal verification in Coq is based on
![Coq for ML users](https://cdn-ak-scissors.b.st-hatena.com/image/square/6582c11389331a43681c0f7bda4051124f23ff1f/height=288;version=1;width=512/https%3A%2F%2Fcdn.slidesharecdn.com%2Fss_thumbnails%2Fdocument-160709151043-thumbnail.jpg%3Fwidth%3D640%26height%3D640%26fit%3Dbounds)