2012-11-30 8 views
6

In coq, è in qualche modo possibile applicare un lemma o un'ipotesi a una sottoespressione dell'obiettivo corrente? Per esempio vorrei applicare il fatto che plus è commutativo per scambiare 3 e 4 in questo esempio.Come utilizzare la riscrittura su una sottoespressione dell'obiettivo corrente

Require Import Coq.Arith.Plus. 

Inductive foobar : nat -> Prop := 
| foob : forall n:nat, foobar n. 

Goal foob (3 + 4) = foob (4 + 3). 
Proof. 
apply plus_comm. (* or maybe rewrite plus_comm *) 

dà:

Error: Impossible to unify "?199 + ?200 = ?200 + ?199" with 
"foob (3 + 4) = foob (4 + 3)". 

Come posso dire a coq dove proprio in questo obiettivo di applicare plus_comm?

risposta

4

L'utilizzo della tattica simpl funziona, ma non chiedermi perché rewrite plus_comm o rewrite (plus_comm 3 4) non funziona. apply è per le implicazioni, non per le equazioni.

+0

Funziona quando faccio quanto segue, che è quello che volevo provare in primo luogo. Goal foobar (3 + 4) = foobar (4 + 3). Prova. riscrivi plus_comm. riflessività. Qed. Immagino che la riscrittura non funzioni sui valori, solo sui tipi. –

+1

'rewrite' funziona su entrambi (in realtà i tipi sono termini in Coq ;-). Il problema principale qui è che 'foob (3 + 4)' ha tipo 'foobar (3 + 4)' e 'foob (4 + 3)' ha tipo 'foobar (4 + 3)'. Coq può controllare che entrambi siano uguali (quindi l'uguaglianza è ben tipizzata), ma 'rewrite' usa una forma intermedia in cui non è il caso, da qui il messaggio di errore criptico che si ottiene con' rewrite (plus_comm 3 4) '. – Virgile

+1

Normalmente, dovresti essere in grado di usare 'pattern' (http://coq.inria.fr/refman/Reference-Manual011.html#pattern) per azioni locali da qualche parte all'interno del termine. Tuttavia, ciò non riesce per la stessa ragione menzionata da @Virgile. Se ciò è possibile, puoi anche passare temporaneamente ad un tipo di uguaglianza "più completo" (ad es. 'JMeq'), fare cose lì e poi tornare indietro. (Mi piace considerarlo come il "numero complesso" - analogo dell'uguaglianza). – nobody

Problemi correlati