Dimostrare irrilevanza in Coq?


18

C'è un modo per dimostrare il seguente teorema in Coq?

Theorem bool_pirrel : forall (b : bool) (p1 p2 : b = true), p1 = p2.

EDIT : un tentativo di dare una breve spiegazione di "che prova irrilevanza è" (correggimi qualcuno se sbaglio o non sono preciso)

L'idea di base è che nel mondo delle proposizioni (o del Proptipo in Coq), ciò a cui tu (e dovresti) tieni veramente è la provabilità di una proposizione, non le prove di essa, potrebbero essercene molte (o nessuna). Nel caso in cui tu abbia più prove, dal punto di vista della dimostrabilità, sono uguali nel senso che dimostrano la stessa proposta . Quindi la loro distinzione è irrilevante. Ciò differisce dal punto di vista computazionale in cui ti interessa davvero la distinzione di due termini, ad esempio, fondamentalmente, non vuoi che i due abitanti del booltipo (o Setnelle parole di Coq), cioè truee falsesiano uguali. Ma se li metti dentro Prop, sono trattati uguali.


Intrigante. Sono sicuro che riceverai una risposta in pochi minuti nella mailing list di Coq. (Assicurati di pubblicare la risposta qui, se lo fai.)
Dave Clarke,

2
Per quelli di noi che sono curiosi di sapere di cosa tratta la tua domanda, ma che non hanno familiarità con Coq, puoi forse aggiungere una o due frasi che spiegano cosa significa quel teorema in inglese? (E forse di quale "prova irrilevanza" si tratta?)
Joshua Grochow,

@Joshua, non sono adeguato a spiegarlo in dettaglio, perché è anche nuovo per me, ecco perché mi ha lasciato perplesso per un bel po 'di tempo. Ma comunque, ecco il mio tentativo (vedi nella parte domanda).
giorno

6
@Joshua, IIRC, nella matematica costruttiva, una prova di un'implicazione come è una funzione / processo / algoritmo / costruzione che converte una prova di A in una prova di B , e la costruzione è una prova irrilevante se la prova risultante di B non dipende in cui viene data la prova per a . UNBUNBBUN
Kaveh,

Risposte:


28

La prova dell'irrilevanza in generale non è implicita dalla teoria alla base di Coq. Anche la prova dell'irrilevanza per l'uguaglianza non è implicita; è equivalente all'assioma K di Streicher . Entrambi possono essere aggiunti come assiomi .

Ci sono sviluppi in cui è utile ragionare su oggetti di prova, e l'irrilevanza di prova rende quasi impossibile. Probabilmente questi sviluppi dovrebbero avere tutti gli oggetti la cui struttura è importante Set, ma con la teoria di base di Coq la possibilità è lì.

C'è un'importante sottocasi di irrilevanza delle prove che vale sempre. L'assioma K di Streicher tiene sempre su domini decidibili, cioè le prove di uguaglianza su insiemi decidibili sono uniche. La prova generale è nel Eqdep_decmodulo nella libreria standard Coq. Ecco il tuo teorema come corollario (la mia prova qui non è necessariamente la più elegante):

Require Bool.
Require Eqdep_dec.
Theorem bool_pirrel : forall (b : bool) (p1 p2 : b = true), p1 = p2.
Proof.
  intros; apply Eqdep_dec.eq_proofs_unicity; intros.
  destruct (Bool.bool_dec x y); tauto.
Qed.

Per questo caso speciale, ecco una prova diretta (ispirata alla prova generale in Eqdep_dec.v). Innanzitutto, definiamo di definire una prova canonica di true=b(come al solito in Coq, è più facile avere la costante prima). Quindi mostriamo che ogni prova true=bdeve essere refl_equal true.

Let nu b (p:true = b) : true = b :=
  match Bool.bool_dec true b with
    | left eqxy => eqxy
    | right neqxy => False_ind _ (neqxy p)
  end.
Lemma bool_pcanonical : forall (b : bool) (p : true = b), p = nu b p.
Proof.
  intros. case p. destruct b.
  unfold nu; simpl. reflexivity.
  discriminate p.
Qed.

Se aggiungi la logica classica a Coq, ottieni prove irrilevanza. Intuitivamente parlando, la logica classica ti dà un oracolo decisionale per le proposizioni, e questo è abbastanza buono per l'assioma K. C'è una prova nel modulo di libreria standard Coq Classical_Prop.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.