Estoy jugando en Coq, tratando de crear una lista ordenada. Solo quería una función que tomara una lista [1,2,3,2,4]
y devolviera algo como Sorted [1,2,3,4]
- es decir, eliminar las partes defectuosas, pero no ordenar realmente la lista completa.Coincidencia de patrones no especializados
Pensé que comenzaría definiendo una función lesseq
de tipo , y luego podría hacer coincidir el patrón fácilmente. Tal vez esa es una mala idea.
El quid de la cuestión que estoy teniendo ahora mismo es que (fragmento, toda la función en la parte inferior)
Fixpoint lesseq (m n : nat) : option (m <= n) :=
match m with
| 0 => match n with
| 0 => Some (le_n 0)
...
no está verificación de tipos; dice que está esperando un option (m <= n)
, pero que Some (le_n 0)
tiene el tipo option (0 <= 0)
. No entiendo, porque obviamente ambos m
y n
son cero en ese contexto, pero no tengo idea de cómo decirle eso a Coq.
La función entera es:
Fixpoint lesseq (m n : nat) : option (m <= n) :=
match m with
| 0 => match n with
| 0 => Some (le_n 0)
| S n_ => None
end
| S m_ => match n with
| 0 => None
| S _ => match lesseq m_ n with
| Some x=> le_S m n x
| None => None
end
end
end.
Tal vez me estoy adelantando a mí mismo y sólo hay que seguir leyendo antes de hacer frente a este.
Por cierto, si sigues este enfoque, te recomiendo usar la función Programa.Le permite escribir su programa en el estilo de la primera lista, pero deje cualquier cantidad de "agujeros" (_), que luego puede "completar" usando tácticas (estilo de la segunda lista). Por lo tanto, le permite separar muy bien la programación y la prueba. – akoprowski
Gracias a ambos por la ayuda. Tengo mucho que aprender, no me di cuenta de que podría usar tácticas para definir funciones (aunque tiene sentido). Ahora estoy de acuerdo en que un tipo de suma (un <= b \/ a > b) sería genial, porque logré implementar el lesseq incorrecto al devolver None cuando quiero Some; esto no sería posible con un tipo más específico. Definitivamente también echaré un vistazo a la biblioteca estándar. –