products/Sources/formale Sprachen/Coq/dev/doc image not shown  

Quellcode-Bibliothek

© Kompilation durch diese Firma

[Weder Korrektheit noch Funktionsfähigkeit der Software werden zugesichert.]

Datei: unification.txt   Sprache: Text

Original von: Coq©

Some notes about the use of unification in Coq
----------------------------------------------

There are several applications of unification and pattern-matching

** Unification of types **

- For type inference, inference of implicit arguments
  * this basically amounts to solve problems of the form T <= U or T = U
    where T and U are types coming from a given typing problem
  * this kind of problem has to succeed and all the power of unification is
    a priori expected (full beta/delta/iota/zeta/nu/mu, pattern-unification,
    pruning, imitation/projection heuristics, ...)

- For lemma application (apply, auto, ...)
  * these are also problems of the form T <= U on types but with T
    coming from a lemma and U from the goal
  * it is not obvious that we always want unification and not matching
  * it is not clear which amounts of delta one wants to use

** Looking for subterms **

- For tactics applying on subterms: induction, destruct, rewrite

- As part of unification of types in the presence of higher-order
  evars (e.g. when applying a lemma of conclusion "?P t")


----------------------------------------------------------------------
Here are examples of features one may want or not when looking for subterms

A- REWRITING

1- Full conversion on closed terms

1a- Full conversion on closed terms in the presence of at least one evars (meta)

Section A1.
Variable y: nat.
Hypothesis H: forall x, x+2 = 0.
Goal y+(1+1) = 0.
rewrite H.
(* 0 = 0 *)
Abort.

Goal 2+(1+1) = 0.
rewrite H.
(* 0 = 0 *)
Abort.

(* This exists since the very beginning of Chet's unification for tactics *)
(* But this fails for setoid rewrite *)

1b- Full conversion on closed terms without any evars in the lemma

1b.1- Fails on rewrite (because Unification.w_unify_to_subterm_list replaces
  unification by check for a syntactic subterm if terms has no evar/meta)

Goal 0+1 = 0 -> 0+(1+0) = 0.
intros H; rewrite H.
(* fails *)
Abort.

1b.2- Works with setoid rewrite

Require Import Setoid.
Goal 0+1 = 0 -> 0+(1+0) = 0.
intros H; rewrite H at 1.
(* 0 = 0 *)
Abort.

2- Using known instances in full conversion on closed terms

Section A2.
Hypothesis H: forall x, x+(2+x) = 0.
Goal 1+(1+2) = 0.
rewrite H.
Abort.
End A2.

(* This exists since 8.2 (HH) *)

3- Pattern-unification on Rels

Section A3a.
Variable F: (nat->nat->nat)->nat.
Goal exists f, F (fun x y => f x y) = 0 -> F (fun x y => plus y x) = 0.
eexists. intro H; rewrite H.
(* 0 = 0 *)
Abort.
End A3a.

(* Works since pattern unification on Meta applied to Rel was introduced *)
(* in unification.ml (8.1, Sep 2006, HH) *)

Section A3b.
Variables x y: nat.
Variable H: forall f, f x y = 0.
Goal plus y x = 0.
rewrite H.
(* 0 = 0 *)
Abort.
End A3b.

(* Works since pattern unification on all Meta was supported *)
(* in unification.ml (8.4, Jun 2011, HH) *)

4- Unification with open terms

Section A4.
Hypothesis H: forall x, S x = 0.
Goal S 0 = 0.
rewrite (H _).
(* 0 = 0 *)
Abort.
End A4.

(* Works since unification on Evar was introduced so as to support rewriting *)
(* with open terms (8.2, MS, r11543, Unification.w_unify_to_subterm_list ) *)

5- Unification of pre-existing evars

5a- Basic unification of pre-existing evars

Section A4.
Variables x y: nat.
Goal exists z, S z = 0 -> S (plus y x) = 0.
eexists. intro H; rewrite H.
(* 0 = 0 *)
Abort.
End A4.

(* This worked in 8.2 and 8.3 as a side-effect of support for rewriting *)
(* with open terms (8.2, MS, r11543) *)

5b- Pattern-unification of pre-existing evars in rewriting lemma

Goal exists f, forall x y, f x y = 0 -> plus y x = 0.
eexists. intros x y H; rewrite H.
(* 0 = 0 *)
Abort.

(* Works since pattern-unification on Evar was introduced *)
(* in unification.ml (8.3, HH, r12229) *)
(* currently governed by a flag: use_evars_pattern_unification *)

5c- Pattern-unification of pre-existing evars in goal

Goal exists f, forall x y, plus x y = 0 -> f y x = 0.
eexists. intros x y H; rewrite H.
(* 0 = 0 *)
Abort.

(* This worked in 8.2 and 8.3 but was removed for autorewrite in 8.4 *)

5d- Mixing pattern-unification of pre-existing evars in goal and evars in lemma

Goal exists f, forall x, (forall y, plus x y = 0) -> forall y:nat, f y x = 0.
eexists. intros x H y. rewrite H.
(* 0 = 0 *)
Abort.

(* This worked in 8.2 and 8.3 but was removed for autorewrite in 8.4 *)

6- Multiple non-identical but convertible occurrences

Tactic rewrite only considers the first one, from left-to-right, e.g.:

Section A6.
Variable y: nat.
Hypothesis H: forall x, x+2 = 0.
Goal (y+(2+0))+(y+(1+1)) = (y+(1+1))+(y+(2+0)).
rewrite H.
(* 0+(y+(1+1)) = y+(1+1)+0 *)
Abort.
End A6.

Tactic setoid rewrite first looks for syntactically equal terms and if
not uses the leftmost occurrence modulo delta.

Require Import Setoid.
Section A6.
Variable y: nat.
Hypothesis H: forall x, x+2 = 0.
Goal (y+(2+0))+(y+2) = (y+2)+(y+(2+0)).
rewrite H at 1 2 3 4.
(* (y+(2+0))+0 = 0+(y+(2+0)) *)
Abort.

Goal (y+(2+0))+(y+(1+1)) = (y+(1+1))+(y+(2+0)).
rewrite H at 1 2 3 4.
(* 0+(y+(1+1)) = y+(1+1)+0 *)
Abort.
End A6.

7- Conversion

Section A6.
Variable y: nat.
Hypothesis H: forall x, S x = 0.
Goal id 1 = 0.
rewrite H.


B- ELIMINATION (INDUCTION / CASE ANALYSIS)

This is simpler because open terms are not allowed and no unification
is involved (8.3).

¤ Dauer der Verarbeitung: 0.12 Sekunden  (vorverarbeitet)  ¤





Download des
Quellennavigators
Download des
sprechenden Kalenders

in der Quellcodebibliothek suchen




Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.


Bemerkung:

Die farbliche Syntaxdarstellung ist noch experimentell.


Bot Zugriff