Skip to content

Instantly share code, notes, and snippets.

@yamarten
Last active November 13, 2023 23:02
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save yamarten/aebed640f962f0e06a7f2ea2f2f08608 to your computer and use it in GitHub Desktop.
Save yamarten/aebed640f962f0e06a7f2ea2f2f08608 to your computer and use it in GitHub Desktop.
Coq関連プログラムリンク集

目についたCoqのライブラリ/プラグイン/開発環境などの覚え書き

実用面は気にせず、研究用や無メンテも載せる

ライブラリ

Coqソースファイルのみで構成されるもの

機能拡張的なものと定理群の区別はしていない

  • Mathematical Components

    • 数学的証明を書き易くするための諸々

  • HoTT

    • ホモトピー型理論

  • Coq.io

    • IOを伴うプログラムが書ける (OCamlに抽出)

  • SimpleIO

    • IOや例外等を定義し、OCamlに抽出出来るように紐付け

  • CUnit

    • 引数リストを使って関数をテストできる

  • CoqQuickCheck

    • 引数生成関数を使って関数をテストできる

  • Fiat

    • 演繹的プログラム合成

    • 仕様を詳細化(refine)していくことで関数(≒実装が一意に定まる仕様)を組み上げていく

    • Facadeを経由してBedrockへの変換・リンクも可能

  • Cocasse

    • 篩型の制約を実行時検査するようなOCamlプログラムを抽出できる

  • 395-2013

    • 関数の計算量を証明できる

    • 似たような研究はいくつかある

  • human-readable_proofs

    • 等式変形などの証明パターンをより自然な記法で行える

  • Falso

    • Falseの証明(バグを用いたもの)

  • Bedrock

    • 分離論理が書ける擬似アセンブリ(Bedrock IL)とその証明のためのライブラリ

    • 対応関係を定義することで、他のアセンブリに変換できる

    • 外部リンク可能なC-like言語Cito(Ćではない)も備えている

  • Bedrock2

    • Bedrockの後継(割と別物)

    • 汎用の擬似アセンブリを介さず、C-likeな言語(ExprImp、単にbedrock2と呼ばれる方が多い?)からriscv-coqへ変換する

プラグイン

OCamlによってCoqに機能を追加しているもの

  • QuickChick

  • CoqAST

    • Template Coq(MetaCoqの一部)の改良版

    • Coqの内部表現をCoqで扱える値として引きずり出す

  • Gc

    • GCを強制実行

  • Ynot

    • 命令型プログラミングが扱える

  • DProof

  • monadification

    • 定義済み関数をモナド化し、計算量などの証明を可能にする

  • Equations

    • 引数に関するパターンマッチを使って関数定義ができる

  • PUMPKIN PATCH

    • 一部の定理の型を変更した時に、それに依存する証明を楽に修正できる

  • paramcoq

    • Parametricityによる同値関係を生成できる

  • ComplCoq

    • rewirteに都合の良いヒントDBを作る

  • FreeSpec

    • Coqで入出力などの作用を持つプログラムを定義する

  • Interection Trees

    • 再帰や状態を持つ言語を定義するための便利ライブラリ

タクティック系プラグイン

  • Rtac

    • 高速なタクティックを作れる

  • Mtac

    • 型付きタクティックを作れる

  • Ltac2

    • 型システム載せたり文法を少し変えたりした便利なLtac

  • SMTCoq

    • SMTで証明項を生成するタクティックを追加する

  • CoqHammer

    • Coq版Sledgehammer

    • E、Z3、Vampireを使っている

  • Nunchaku-Coq

    • 反例生成器Nunchakuをゴールに対して適用するタクティックを追加する

  • Tactician

    • 既存の証明スクリプトを元に今使えそうなタクティックを提案する

    • 提案タクティックを使って自動証明させることもできる

  • TacTok

    • 機械学習による証明生成ツール

    • Coqとは独立したPythonスクリプト

情報表示系プラグイン

Coq処理系

抽出言語追加

  • Python

    • miniMLのASTからPythonのASTに変換し、OCamlのPythonライブラリを使って出力している

    • 都合の悪いコード(同じ名前の変数を複数回宣言など)があるとエラーを吐く仕様

  • Ruby

  • Scala(v8.4)

    • Coqで書いてるらしいがExtractionしたOCamlしかない

    • miniMLに対して型推論することで型情報を補間している

    • 論文もある

  • Clojure

  • SML

  • F#

  • Erlang

    • Coqで書いた変換コードをOCamlにExtractionしている

    • ここの解説がExtraction拡張の概要をつかむには便利かも

  • Rust

  • Haxe

    • Haxe経由でC++とかJavaとかJavascriptとか諸々に変換可能なはず

  • Lisp

    • 抽出したSchemeをCommon Lisp等で使えるように変換する

標準の抽出機能ではないもの

  • codegen

    • Cコードの生成

  • Scallina

    • Scalaコードの生成

  • RelationExtraction

    • InductiveなPropをOCamlの関数として抽出

  • CoqInE

    • Coqの証明をDeduktiにエクスポートする(抽出ではない)

  • Concert

    • これ自体はスマートコントラクトのフレームワークだが、MetaCoqベースの抽出機能を持つ

    • Liquidity, LIGO, Elm, Rust(+Concordium)

  • Fiat-Crypto

    • 暗号ライブラリだが、独自機構で様々な言語に変換される

    • C, Bedrock2, Go, Rust, Zig

    • Zigコードは標準ライブラリに採用されている

Coqを裏で利用するツール

  • SpatchCoq

    • より自然言語っぽく書ける証明ソフト

  • GeoProof(故)

    • Coqを利用した幾何証明ソフト

  • ccg2lambda

    • 自然言語解析ツール

Coqコードや命題を生成するツール

  • Why3

    • SMTやC等をCoqで証明できる

  • Ott

    • 言語定義をCoqにしたりやLaTeXで表したり

  • Spoofax

    • 言語の一部の性質をCoqで証明できる言語ワークベンチ

    • ツール全体からするとおまけ的な機能っぽい

  • Needle&Knot

    • Coqをバックエンドに持つプログラミング言語

  • Lem

    • プログラムを作って各種証明アシスタントに投げられる

  • CoqOfOCaml

    • OCamlをCoqに変換する

  • hs-to-coq

    • HaskellをCoqに変換する

  • Concoqtion (故)

    • OCamlに依存型を導入して、証明が必要な部分だけCoqを使う

  • FoCaLiZe

    • Coqの命題とOCamlのプログラムを吐くCoqよりリッチ目な言語

  • RustBelt

    • Rustでunsafeを使っても大丈夫なことを証明する

  • Goose

    • GoのコードをCoqに変換して証明できるようにする

  • coqffi

    • mliファイルから対応するCoq定義を生成し、依存関係を持つOCamlプログラムをいい感じに抽出出来るようにする

Coqの証明を生成するツール

  • Fellowship (故)

    • CoqとPVS両方の証明記述を生成できるsuper-prover

  • CL Vernacular

    • Coherent Logicを使った証明アシスタントで、CoqとIsabelle両方の証明を吐ける

  • Cosette

    • SQLクエリの等価性を自動証明し、Coq形式で出力する

Coqを便利にするツール

ドキュメント生成

  • Proviola

    • coqdocの証明部分に各ステップの状態を表示する機能を追加する

  • CoqdocJS

    • 証明を動的に表示/非表示できたり特定文字列を置換できたりするcoqdoc亜種

  • coq2html

    • 証明が折りたためるcoqdoc亜種

  • Alectryon

    • Coqコードから各行の実行結果を併せて表示するHTMLを生成する

    • 表示形式を選べることが特徴で、単に記号を使うだけでなく図示等も可能

  • condoc

    • coqdoc形式のファイルをmarkdownに変換する

  • HELM (MoWGLI)

    • Coqの証明をXMLに変換してwebで見る (8.4あたりまで搭載されていた?)

  • Coqatoo

    • Coqの証明内の基本タクティックに対し、その動作を示すコメントをつける

  • coq2latex

    • Coqの型定義を元に推論規則を表すLaTeXを生成する

  • Coq Proof Script Visualiser

    • Coqの証明をステップごとにゴールと自然言語で表現することで可読にする

その他

  • iCoq

    • 証明の一部が変更された時、関係する証明のみチェックする

  • coq-min-imports

    • 不要なImportコマンドを消す

  • coq-log-analysis

    • Coqが吐くログを整理する

  • GamePad

    • Coqの証明を機械学習で生成する

  • SerAPI

    • Coqを操作するAPIを提供する

  • REPLICA

    • Coqの利用データを記録する(統計データ収集を想定)

  • Docker-Coq action

    • Coqプロジェクト用のGithub Action

Coqプログラム

  • CoqInCoq

    • CIC(だいたいGallina)の形式化

  • Formalizing 100 Theorems

    • 100定理形式化

  • Coqoban

    • 倉庫番 (ゲーム)

  • Reflex

    • Coqでアプリが書ける?

  • JSCert

    • 証明付きJavaScript

  • CH2O

    • 証明付きC

  • NuprlInCoq

    • 証明アシスタントNuprlのCoq版

  • EVM形式化

  • Perseque

    • Persec風パーサコンビネータ

    • 「"1+1"はexprである」などの命題が書けるようになる

  • Cheerios

    • シリアライザ

    • 自前の型については自分で両方向の変換と証明を書く必要がある

    • Coqでこれを使ってプログラムを書いた後、OCcamlに抽出して使うことを主に想定していると思う

  • CoqLACL

Coq製ソフトウェア

主に抽出によって実行ファイルが生成されるようなもの

  • CompCert

    • Coqで証明されたCコンパイラ

  • Pluto

    • Coqウェブサーバ

    • Dockerfilleを見るとわかるように、多くのライブラリを使っている点に注意

  • ChickBlog

    • ブログエンジン

  • Vellvm

  • Quark

    • Coqによって幾つかの安全性が示されているブラウザ

    • Coq製カーネル部はOCamlに抽出し、ガワはPythonを使っている

  • Fitch

    • Fitch記法に基づく小さな証明言語

    • Ottで言語定義している

  • FSCQ

    • ファイルシステム

    • Coq・OCaml・Haskell・Goのハイブリッド

  • Q*cert

    • クエリコンパイラ

    • ソース言語とターゲット言語をそれぞれ複数持つ

Coqによる形式化/証明

既存の証明を形式化した話なら探せば沢山ある

  • 四色定理

    • Coqによる証明の中でも代表的なやつ

    • 元の証明では(膨大な場合分けに対応するため?)一部でプログラムを使っていたのでバグが心配だったが、Coqで形式化することで信頼性が増した

  • Feit–Thompsonの奇数位数定理

    • 証明されてはいたが非常に難しかったので形式化した

    • 6年かかった

  • 素集合データ構造

    • 既存のデータ構造の永続版を作り、その正当性を証明した

  • ホモトピー型理論

    • 形式化しながら議論してるらしい

    • 現在はAgdaやLeanでもやってる

  • MetaCoq

    • CoqでCoqを形式化や検証する

インパクトに関して、ソフトウェアではCakeMLseL4、数学ではFlyspecに勝てない感じが個人的にある。

開発環境

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment