2016-04-05 12 views
5

私は、Haskellでよく使われるCoqの非決定性(MonadPlusや一般的なリストよりもあまり知られていない)のあまり知られていないモナド符号化をモデル化しようとしました。例えば、リストのエンコーディングは、Coqの対応する定義が以下のようになるのに対して、リストのエンコーディングは、 Coqの非決定性コンポーネントを持つデータ構造

data List m a = Nil | Cons (m a) (m (List m a)) 

のようになります。

Inductive List (M: Type -> Type) (A: Type) := 
    Nil: List M A 
| Cons : M A -> M (List M A) -> List M A. 
ただし、インダクティブデータタイプの「厳密にポジティブな」条件のため、この種の定義はCoqでは許可されていません。

私がCoq特有の答えや、Coqで正式化できるHaskellの代替実装を目指しているかどうかはわかりませんが、この問題を解決する方法については何かお勧めします。

+2

あなたはおそらく([ 'Freer']を探しているhttp://okmij.org/ ftp/Haskell/extensible/more.pdf)のモナドとそこにある 'NDet'の効果です。すべてが厳密に肯定的であり、この表現は[確定した選択](http://okmij.org/ftp/papers/LogicT.pdf)であなたに非決定性を与えます。私はAgdaのそれ(https://github.com/effectfully/Eff/blob/master/Simple/Effect/NonDet.agda)を実装しましたが、コードは宇宙の多形性を扱うAgdaの方法のせいで恐ろしいです。 – user3237465

+1

コミットされた選択(またはFLPコミュニティがコールするのが好きなのでコール時の選択)は、私がCoqで正式にしたいものです!私の現在のソースは、モナドで非決定論のFLP風のセマンティクスを明示的にモデリングしている[別の論文](http://homes.soic.indiana.edu/ccshan/rational/lazy-nondet.pdf)です。私はまだどのモデルがCoqで使用するのに最適かを理解しようとしているので、私は間違いなくOlegの「Freer」モナドによる表現を見ようとしています。紙(別の文脈のために)。だから、ありがとうございました! – ichistmeinname

答えて

3

Chlipala's "Certified Programming with Dependent Types"を参照してください。 Definition Id T := T -> Tがある場合は、List Idは非終端の用語を生成する可能性があります。 Nilコンストラクタを削除し、除外された中間の法則を受け入れる場合は、Definition Not T := T -> Falseによって矛盾を引き出すこともできると思います。

Mにアノテーションを付ける方法がある場合は、正の位置で引数を使用するだけでいいはずです。私はAndreas Abelがこの方向でいくつかの仕事をしていると思います。とにかく

、あなたのデータ型少しだけを制限するために喜んでいる場合は、使用できます。

Fixpoint SizedList M A (n : nat) : Type := 
    match n with 
    | 0 => unit 
    | S m => option (M A * M (SizedList M A m)) 
    end. 

Definition List M A := { n : nat & SizedList M A n }. 
+1

その方向でのアベルの仕事は[MiniAgda](http://www2.tcs.ifi.lmu.de/~abel/miniagda/)に実装されています。 – gallais

+0

迅速な回答ありがとうございます。残念ながら、私はまだCoqの初心者だと書いていることを忘れていました。このエンコーディングの背後にあるアイディアについて少し詳しく説明できますか? 'リストM A''と' existT'を使って値を定義するのは正しい方法ですか?この種の工事は私にとっては新しいもので、何とかグーグルが助けにならなかった。 – ichistmeinname

関連する問題