L'ordine delle dichiarazioni in un tipo induttivo è importante?


9

Mi chiedevo se l'ordine delle dichiarazioni di tipo induttivo può importare.

Ad esempio in Coq puoi definire Nat:

Inductive Nat :=
  | O : Nat
  | S : Nat -> Nat.

o

Inductive Nat :=
  | S : Nat -> Nat
  | O : Nat.

Questo forse cambierà l'ordine dei parametri nell'eliminatore generato automaticamente, ma non è un grosso problema.

Quello che mi chiedo è se è possibile scrivere una dichiarazione come

Inductive typewhereordermatters :=
  | cons1 : type1
  | cons2 : type2.

dove type2è un tipo dipendente, a seconda di cons1? (e in questo caso, scrivere le dichiarazioni nell'altro ordine non avrebbe alcun significato, perché type2farebbe riferimento a cons1ciò che non esiste ancora).

Risposte:


10
  1. L'ordine non ha importanza. Non riesco a pensare a un caso in cui sarebbe. Come sottolinea Andrej Bauer in un commento, se si modifica l'ordine il risultato è canonicamente isomorfo rispetto all'originale .

  2. Un caso non può dipendere da un altro caso. Gli elementi della somma rappresentano una scelta, quindi non ha senso che la scelta fatta dipenda da una scelta che non viene presa.


2
Puoi essere più specifico sul tuo primo punto. L'ordine non ha importanza. Se si modifica l'ordine, il risultato è canonicamente isomorfo rispetto all'originale.
Andrej Bauer,

2
@Dave: grazie! Stavo ponendo questa domanda a causa della (teoria altamente sperimentale dei) tipi induttivi superiori, in cui questo fenomeno sembra accadere , e volevo sapere se ciò può avvenire anche con i tipi induttivi regolari.
Guillaume Brunerie,

1
@Guillaume: non sono sicuro di quale fenomeno stai indicando con il link. Le diverse clausole del costruttore di una definizione del tipo di dati non possono dipendere l'una dall'altra, indipendentemente dal fatto che si tratti di un tipo di dati di ordine superiore. Forse stai pensando ai record dipendenti (che sono usati al link e sono disponibili in Agda e in Coq )?
Noam Zeilberger,

1
@Noam: nell'esempio del tipo induttivo superiore circle, il tipo del loopcostruttore dipende dal basecostruttore.
Guillaume Brunerie

2
@Guillaume: vedo ora (stanno introducendo una sintassi sperimentale), non so come mi sia perso.
Noam Zeilberger,

6

L'ordine è importante nel modo in cui lo chiedi? No.

Ma l'ordine è del tutto irrilevante per il funzionamento dell'assistente prove? Ancora una volta no. In Matita, un assistente di prova molto simile a Coq, l'ordine in cui i costruttori sono scritti in una definizione induttiva non importa per il controllo di tipo, in particolare quando il tipo di controllo di un'espressione partita.

Matita deve prima verificare che tutti i costruttori vengano confrontati nel corpo della partita. Lo fa scorrendo ciclicamente i costruttori nell'ordine in cui sono dichiarati. Quindi, si tratta di digitare l'espressione di corrispondenza corretta, che avviene in ordine inverso, controllando prima il caso dell'ultimo costruttore dichiarato. Questo tipo viene quindi eseguito e utilizzato per verificare gli altri casi.

Questo appare molto spesso quando si scrive un'espressione di corrispondenza di grandi dimensioni. Vorresti prima compilare i casi facili, lasciando i casi più difficili sotto un carattere jolly, digitando periodicamente ciò che hai scritto per assicurarti che abbia senso. A volte Matita non è in grado di inferire il tipo dell'espressione di corrispondenza incompleta, ma lo farà abbastanza felicemente se riempi il caso per l'ultimo costruttore definito nel tipo induttivo.

Presumo, anche se non sono sicuro, che Coq faccia qualcosa di simile.

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.