2

単純型付きラムダ計算で型付きラムダ計算が一意であるという証明は、紙の上では簡単です。私が精通しているという証拠は、タイピングの派生に関する完全な帰納法によって進められます。ただし、タイピング派生のタイプで表されるタイピング派生が一意であること証明するのに苦労しています。dec Γ x τここで、変数のxタイプτがenvironmentの場合、述語はtrueですΓ。型付き述語Jは通常どおりに定義され、単純型付きラムダ計算の型付き規則を読み取るだけです。

Inductive J (Γ : env) : term → type → Set :=
  | tvar : ∀ x τ, dec Γ x τ → J γ (var x) τ
  | tabs : ∀ τ₁ τ₂ e, J (τ₁ :: γ) e τ₂ → J γ (abs τ₁ e) (arr τ₁ τ₂)
  | tapp : ∀ τ₁ τ₂ e₁ e₂, J γ e₁ (arr τ₁ τ₂) → J γ e₂ τ₁ → J γ (app e₁ e₂) τ₂.

Jタイピングの派生が一意であることを証明するときに、タイプの用語の構造を公開するのに問題があります。たとえば、私は次の補題のいずれd1かで誘導することはできますが、その後破壊して逆に誘導することはできません。Coqによって表示されるエラーメッセージ(用語を抽象化すると、タイプが正しくない用語になります)は少しわかりにくく、Coqwikiは何の助けにもなりません。参考までに、これは私が証明しようとしている見出語です。d2d1d2

Lemma unique_derivation : ∀ Γ e τ (d₁ d₂ : J Γ e τ), d₁ = d₂.

タイプがユニークであることを証明するときなど、用語を導入するときに問題はありません。

編集:問題が発生した結果を示すために必要な最小限の定義を追加しました。huitseekerのコメントに応えて、J抽出などの操作を実行し、Coqでこれまで行ったことのない一意性などの結果を証明するために、派生を構造化オブジェクトとして入力することについて推論したかったので、この種が選択されました。

コメントの最初の部分に応じて、またはのinductionいずれd1d2で実行できますが、実行は、、、または残りの用語をinduction使用できません。これは、両方の構造を公開することはできず、両方のプルーフツリーについて推論することはできないことを意味します。私がそうしようとしたときに私が受け取るエラーは、残りの用語を抽象化すると、タイプが正しくない用語につながることを示しています。destructcaseinductiond1d2

Require Import Unicode.Utf8.
Require Import Utf8_core.
Require Import List.

Inductive type : Set :=
  | tau : type
  | arr : type → type → type.

Inductive term : Set :=
  | var : nat → term
  | abs : type → term → term
  | app : term → term → term.

Definition dec (Γ : list type) x τ : Prop :=
  nth_error γ x = Some τ.

Inductive J (Γ : list type) : term → type → Set :=
  | tvar : ∀ x τ, dec Γ x τ → J Γ (var x) τ
  | tabs : ∀ τ₁ τ₂ e, J (τ₁ :: Γ) e τ₂ → J Γ (abs τ₁ e) (arr τ₁ τ₂)
  | tapp : ∀ τ₁ τ₂ e₁ e₂, J Γ e₁ (arr τ₁ τ₂) → J Γ e₂ τ₁ → J Γ (app e₁ e₂) τ₂.

Lemma derivations_unique : ∀ Γ e τ (d1 d2 : J Γ e τ), d1 = d2.
Proof. admit. Qed.

ライブラリdependent inductionからいくつかの結果を試してみましたが、成功しませんでした。Coq.Logic派生がユニークであるということは、証明するのが簡単な命題であるように思われます。

4

1 に答える 1

1

あなたには 3 つの問題があります。

1 つは誘導を機能させるという純粋に技術的な問題です。主な問題はタクティックで解決できますdependent destruction( Coq-Club メーリング リストの Matthieu Sozeau の厚意による)。これは反転戦術です。ボンネットの下でどのように機能するかを理解しているふりはしません。

2 番目の問題は、基本的なケースの 1 つである環境です。の等式証明list natが一意であることを証明する必要があります。これはすべての決定可能なドメインに適用され、そのためのツールはEqdep_decモジュールにあります。

3 番目の問題は、問題に関連するものです。派生の単一性は、用語または派生構造に対する直接的な帰納には従いません。これは、用語が派生を再構築するのに十分な型情報を持っていないためです。アプリケーションapp e1 e2では、引数の型を直接知る方法はありません。単純に型付けされたラムダ計算では、型の再構築が成立し、証明も容易です。大規模な計算 (ポリモーフィズムまたはサブタイピングを使用) では成立しない場合があります (たとえば、ML スタイルのポリモーフィズムでは、固有のプリンシパル型スキームと関連する派生がありますが、基本型を使用した多くの派生があります)。

これがあなたの補題の簡単な証明です。環境ルックアップの単一性の証明は省略しました。項構造または派生構造に推論できます — この単純な証明は、それらが同じであるため機能します。

Require Import Unicode.Utf8.
Require Import Utf8_core.
Require Import List.
Require Import Program.Equality.

Inductive type : Set :=
  | tau : type
  | arr : type → type → type.

Inductive term : Set :=
  | var : nat → term
  | abs : type → term → term
  | app : term → term → term.

Definition dec (Γ : list type) x τ : Prop :=
  nth_error Γ x = Some τ.

Inductive J (Γ : list type) : term → type → Set :=
  | tvar : ∀ x τ, dec Γ x τ → J Γ (var x) τ
  | tabs : ∀ τ₁ τ₂ e, J (τ₁ :: Γ) e τ₂ → J Γ (abs τ₁ e) (arr τ₁ τ₂)
  | tapp : ∀ τ₁ τ₂ e₁ e₂, J Γ e₁ (arr τ₁ τ₂) → J Γ e₂ τ₁ → J Γ (app e₁ e₂) τ₂.

Lemma unique_variable_type :
  forall G x t1 t2, dec G x t1 -> dec G x t2 -> t1 = t2.
Proof.
  unfold dec; intros.
  assert (value t1 = value t2). congruence.
  inversion H1. reflexivity.
Qed.

Axiom unique_variable_type_derivation :
  forall G x t (d1 d2 : dec G x t), d1 = d2.

Lemma unique_type : forall G e t1 t2 (d1 : J G e t1) (d2 : J G e t2), t1 = t2.
Proof.
  intros G e; generalize dependent G.
  induction e; intros.

  dependent destruction d1. dependent destruction d2.
  apply (unique_variable_type G n); assumption.

  dependent destruction d1. dependent destruction d2.
  firstorder congruence.

  dependent destruction d1. dependent destruction d2.
  assert (arr τ₁ τ₂ = arr τ₁0 τ₂0).
  firstorder congruence.
  congruence.
Qed.

Lemma unique_derivation : forall G e t (d1 d2 : J G e t), d1 = d2.
Proof.
  intros G e; generalize dependent G.
  induction e; intros.

  dependent destruction d1. dependent destruction d2.
  f_equal. solve [apply (unique_variable_type_derivation G n)].

  dependent destruction d1. dependent destruction d2.
  f_equal. solve [apply IHe].

  dependent destruction d1. dependent destruction d2.
  assert (τ₁ = τ₁0). 2: subst τ₁.
  solve [eapply unique_type; eauto].
  f_equal; solve [firstorder].
Qed.
于 2012-09-05T18:34:17.077 に答える