Coqで既存の型付きコンストラクターの等価性を実装するための型のパターンマッチング

私は私の名前です

存在記号のあるデータ型に再び小さな問題があるとしましょう。今回は、typeの2つの値がいつext等しいかを定義したいと思います

Inductive ext (A: Set) :=
| ext_ : forall (X: Set), option X -> ext A.

Fail Definition ext_eq (A: Set) (x y: ext A) : Prop :=
  match x with
  | ext_ _ ox => match y with
                 | ext_ _ oy => (* only when they have the same types *)
                                ox = oy
                 end
  end.

私がやりたいのは、実存型が実際に同じである場合とそうでない場合をどうにかして区別することです。これはJMeqの場合ですか、それともそのような場合の区別を実現する他の方法がありますか?

私はたくさんグーグルで検索しましたが、残念ながら、依存パターンマッチングに関する投稿に出くわしました。

また、を使用して(ブール)スキームを生成しようとしScheme Equality for extましたが、type引数のため、これは成功しませんでした。

ガレ

私がやりたいのは、実存型が実際に同じである場合とそうでない場合をどうにかして区別することです。

Coqの論理は、同型型が等しいという一価公理と互換性があるため、これは不可能です。したがって、(unit * unit)unitは構文的には異なりますが、Coqのロジックでは区別できません。

考えられる回避策は、関心のあるタイプのコードのデータ型を用意し、それを実存的なものとして保存することです。このようなもの:

Inductive Code : Type :=
  | Nat : Code
  | List : Code -> Code.

Fixpoint meaning (c : Code) := match c with
  | Nat     => nat
  | List c' => list (meaning c')
end.

Inductive ext (A: Set) :=
  | ext_ : forall (c: Code), option (meaning c) -> ext A.

Lemma Code_eq_dec : forall (c d : Code), { c = d } + { c <> d }.
Proof.
intros c; induction c; intros d; destruct d.
- left ; reflexivity.
- right ; inversion 1.
- right ; inversion 1.
- destruct (IHc d).
  + left ; congruence.
  + right; inversion 1; contradiction.
Defined.

Definition ext_eq (A: Set) (x y: ext A) : Prop.
refine(
  match x with | @ext_ _ c ox =>
  match y with | @ext_ _ d oy =>
  match Code_eq_dec c d with
   | left eq   => _
   | right neq => False
  end end end).
subst; exact (ox = oy).
Defined.

ただし、これにより、にパックできるタイプの種類がかなり制限されることは明らかですext他のより強力な言語(たとえば、誘導再帰を備えている)は、より表現力を与えます。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

パターンマッチングを使用するためのScalaのコンパイル時型定数

分類Dev

Scala:型パラメーターなしでscalaの「型付き」クラスを含むJavaインターフェースを実装する方法

分類Dev

JavaのようなSwiftでコンストラクタ付きの列挙型を実装する方法は?

分類Dev

HList型を減算するための型コンストラクター?

分類Dev

パラメーターなしのコンストラクターの型をチェックする方法は?

分類Dev

パラメーターなしのコンストラクターの型をチェックする方法は?

分類Dev

パターンマッチングなしで動的型付け言語で合計型を実装する方法

分類Dev

C ++ 11では、非集計型のコンストラクターのような集計型初期化を実装できますか?また、その方法は?

分類Dev

Scalaでのパターンマッチングの問題:「エラー:コンストラクターを期待される型にインスタンス化できません」

分類Dev

Haskell関数の型クラスインスタンスに対するパターンマッチング

分類Dev

パターンマッチング方法及びクラス型パラメータの型推論の間の差

分類Dev

一般化された型制約を含むクラスでのパターンマッチング

分類Dev

一般化された型制約を含むクラスでのパターンマッチング

分類Dev

Groovy列挙型コンストラクターのマッチング

分類Dev

型コンストラクターを返すためのhaskell型署名

分類Dev

重複コードを減らすためのカスタムツリーデータ型のHaskellパターンマッチング

分類Dev

Scala:パス依存型でのパターンマッチング

分類Dev

型制約のあるジェネリッククラスでのF#パターンマッチング

分類Dev

データコンストラクターの型へのマッピング

分類Dev

命令型で記述されたCプログラムへのオブジェクト指向インターフェースを実装するためのパターン

分類Dev

トライツリーでのパターンマッチングの実装

分類Dev

引数で暗黙の型変換のためのコンストラクターを定義する方法は?

分類Dev

Coqで共誘導型ストリームの「ヘッド」を定義します(パターンマッチングなし)

分類Dev

実存的な型情報を保持するためにパターンマッチングが必要なのはなぜですか?

分類Dev

別の引数の型で引数のパス依存型をコンストラクターに参照する

分類Dev

型パターンマッチングを型クラスに変換する

分類Dev

他のコンパイラのMicrosoftCのように、型付きまたは型名を使用してコンストラクタを宣言できますか?

分類Dev

C ++でカウンターを実装する際のマップコンストラクター

分類Dev

C ++ 17の推定された「自動」非型「テンプレート」パラメータは、明示的な非型パラメータとテンプレートをパターンマッチングできますか?

Related 関連記事

  1. 1

    パターンマッチングを使用するためのScalaのコンパイル時型定数

  2. 2

    Scala:型パラメーターなしでscalaの「型付き」クラスを含むJavaインターフェースを実装する方法

  3. 3

    JavaのようなSwiftでコンストラクタ付きの列挙型を実装する方法は?

  4. 4

    HList型を減算するための型コンストラクター?

  5. 5

    パラメーターなしのコンストラクターの型をチェックする方法は?

  6. 6

    パラメーターなしのコンストラクターの型をチェックする方法は?

  7. 7

    パターンマッチングなしで動的型付け言語で合計型を実装する方法

  8. 8

    C ++ 11では、非集計型のコンストラクターのような集計型初期化を実装できますか?また、その方法は?

  9. 9

    Scalaでのパターンマッチングの問題:「エラー:コンストラクターを期待される型にインスタンス化できません」

  10. 10

    Haskell関数の型クラスインスタンスに対するパターンマッチング

  11. 11

    パターンマッチング方法及びクラス型パラメータの型推論の間の差

  12. 12

    一般化された型制約を含むクラスでのパターンマッチング

  13. 13

    一般化された型制約を含むクラスでのパターンマッチング

  14. 14

    Groovy列挙型コンストラクターのマッチング

  15. 15

    型コンストラクターを返すためのhaskell型署名

  16. 16

    重複コードを減らすためのカスタムツリーデータ型のHaskellパターンマッチング

  17. 17

    Scala:パス依存型でのパターンマッチング

  18. 18

    型制約のあるジェネリッククラスでのF#パターンマッチング

  19. 19

    データコンストラクターの型へのマッピング

  20. 20

    命令型で記述されたCプログラムへのオブジェクト指向インターフェースを実装するためのパターン

  21. 21

    トライツリーでのパターンマッチングの実装

  22. 22

    引数で暗黙の型変換のためのコンストラクターを定義する方法は?

  23. 23

    Coqで共誘導型ストリームの「ヘッド」を定義します(パターンマッチングなし)

  24. 24

    実存的な型情報を保持するためにパターンマッチングが必要なのはなぜですか?

  25. 25

    別の引数の型で引数のパス依存型をコンストラクターに参照する

  26. 26

    型パターンマッチングを型クラスに変換する

  27. 27

    他のコンパイラのMicrosoftCのように、型付きまたは型名を使用してコンストラクタを宣言できますか?

  28. 28

    C ++でカウンターを実装する際のマップコンストラクター

  29. 29

    C ++ 17の推定された「自動」非型「テンプレート」パラメータは、明示的な非型パラメータとテンプレートをパターンマッチングできますか?

ホットタグ

アーカイブ