この簡単な開発を考えてみましょう。私は2つの些細なデータ型を持っている:タイプクラスと自動戦術の相互作用
Inductive A :=
| A1
| A2.
Inductive B :=
| B1 : A -> B
| B2.
は、今私は関係の概念を導入し、データ型A
とB
に発注定義誘導データ型として表現:
Definition relation (X : Type) := X -> X -> Prop.
Reserved Notation "a1 '<=A' a2" (at level 70).
Inductive AOrd : relation A :=
| A1_Ord : A1 <=A A1
| A2_Ord : A2 <=A A2
| A1_A2 : A1 <=A A2
where "a1 '<=A' a2" := (AOrd a1 a2).
Reserved Notation "b1 '<=B' b2" (at level 70).
Inductive BOrd : relation B :=
| B1_Ord : forall a1 a2,
a1 <=A a2 -> B1 a1 <=B B1 a2
| B2_Ord :
B2 <=B B2
| B1_B2 : forall a,
B1 a <=B B2
where "b1 '<=B' b2" := (BOrd b1 b2).
最後に、私は概念を導入します再帰性のと私の関係の両方が反射的であることを証明:
Definition reflexive {X : Type} (R : relation X) :=
forall a : X, R a a.
Hint Constructors AOrd BOrd.
Theorem AOrd_reflexive : reflexive AOrd.
Proof.
intro a. induction a; auto.
Qed.
Hint Resolve AOrd_reflexive.
Theorem BOrd_reflexive : reflexive BOrd.
Proof.
intro b. induction b; auto.
Qed.
どちらの証明はで終了します第1の証拠は決定的にHint Constructors
に依存し、第2の証拠はさらにHint Resolve AOrd_reflexive
にヒントデータベースに追加されている。
上記コードの醜いところは、A
とB
のデータ型の順序関係のための別個の表記法です。どこでも一様に<=
を使用できるようにしたいと考えています。 This answerは問題の解決策を提供します:型クラスを使用します。だから私は、注文するための型クラスを導入し、この新しい表記法を使用するために私の順序関係を再定義:
Class OrderR (T : Type) := orderR : relation T.
Notation "x '<=' y" := (orderR x y) (at level 70).
Inductive AOrd : OrderR A :=
| A1_Ord : A1 <= A1
| A2_Ord : A2 <= A2
| A1_A2 : A1 <= A2.
Inductive BOrd `{OrderR A} : OrderR B :=
| B1_Ord : forall a1 a2,
a1 <= a2 -> B1 a1 <= B1 a2
| B2_Ord :
B2 <= B2
| B1_B2 : forall a,
B1 a <= B2.
Hint Constructors AOrd BOrd.
しかし、今証明オートメーション休憩を!たとえば:
2 subgoals, subgoal 1 (ID 32)
─────────────────────────────────────────────────────
AOrd A1 A1
auto
はもはやヒントデータベースにあるAOrd
コンストラクタにもかかわらず、解決していること:
Theorem AOrd_reflexive : reflexive AOrd.
Proof.
intro a. induction a.
は目標を私に残します。でも、私はconstructor
でゴールを解決することができます:
Theorem AOrd_reflexive : reflexive AOrd.
Proof.
intro a. induction a; constructor.
Qed.
より多くの問題は、第二の証明で発生します。やった後:
Theorem BOrd_reflexive `{OrderR A} : reflexive BOrd.
Proof.
intro b. induction b. constructor.
を私が目標に残っていないのです:
2 subgoals, subgoal 1 (ID 40)
H : OrderR A
a : A
─────────────────────────────────────────────────────
a <= a
は再び、auto
は、もはやこの目標を解決します。 Even apply AOrd_reflexive
も機能しません。
私の質問は:型クラスに依存して一貫した表記をし、証明自動化の利点を維持することは可能ですか?または、さまざまなデータ型に対して一意の表記法を使用することとは異なる解決策があります。
ねえ月、それはあなたの特定の問題を解決するが、必ず型クラスのインスタンスは 'auto'検索に参加させるためにtypeclass_instances.'戦術バリエーションを持つ'オートがあるかどうかわかりません。 – Ptival
@Ptival、私はこれが私の場合はうまくいきません。 –