Durante il tentativo di scrivere il codice riutilizzabile su un predicato induttiva su liste mi viene spontaneo dichiarato:Da un predicato induttivo alla lista A -> Lista A -> bool
Parameter A:Type.
Poi ho proceduto a definire il predicato binario (per esempio):
Inductive prefix : list A -> list A -> Prop :=
| prefixNil: forall (l: list A), prefix nil l
| prefixCons: forall (a: A)(l m:list A), prefix l m -> prefix (a::l) (a::m).
che esprime il fatto che un dato elenco è un prefisso di un altro. Si può quindi continuare a studiare questa relazione e mostrare (per esempio) che si tratta di un ordine parziale. Fin qui tutto bene. Tuttavia, è molto facile definire un predicato induttivo che non corrisponda alla nozione matematica in mente. Vorrei convalidare la definizione induttiva definendo inoltre una funzione:
isPrefixOf: list A -> list A -> bool
con lo scopo di dimostrare l'equivalenza:
Theorem prefix_validate: forall (l m: list A),
prefix l m <-> isPrefixOf l m = true.
Questo è dove devo limitare la generalità del codice mentre non può più funzionare con list A
. In Haskell, abbiamo isPrefixOf :: Eq a => [a] -> [a] -> Bool
, quindi capisco che devo fare qualche ipotesi su A
, qualcosa come 'Eq A
'. Naturalmente, potrei ipotizzare:
Parameter equal: A -> A -> bool
Axiom equal_validate: forall (a b: A),
a = b <-> equal a b = true.
e procedere da lì. Probabilmente lo farei in un altro file o in una sezione, in modo da non compromettere la piena generalità del codice precedente. Tuttavia, sento di re-inventare la ruota. Questo è probabilmente un modello comune (che esprime qualcosa come Haskell Eq a => ...
).
Quale dichiarazione (idiomatica, comune) dovrei fare riguardo al tipo A
che mi consente di procedere mantenendo il codice il più generale possibile?
e preferisco la stessa, che funziona più bello con l'estrazione per esempio. Come ha detto @ejgallego, dipende dal tuo gusto/caso d'uso – Vinz
Grazie mille !!! –
Molto bello! Se hai fornito esempi di calcolo con 'prefisso' (per entrambi i casi), la risposta diventerebbe ancora più bella, dal momento che stiamo cambiando la firma della funzione (almeno nel primo caso, dove introduciamo un nuovo argomento) –