Voici une simple théorie écrite sur la plaine HOL:Comment prouver en HOLCF que le double retour d'une liste ne change pas
theory ToyList
imports Main
begin
no_notation Nil ("[]") and Cons (infixr "#" 65) and append (infixr "@" 65)
hide_type list
hide_const rev
datatype 'a list = Nil ("[]") | Cons 'a "'a list" (infixr "#" 65)
primrec snoc :: "'a list => 'a => 'a list" (infixr "#>" 65)
where
"[] #> y = y # []" |
"(x # xs) #> y = x # (xs #> y)"
primrec rev :: "'a list => 'a list"
where
"rev [] = []" |
"rev (x # xs) = (rev xs) #> x"
lemma rev_snoc [simp]: "rev(xs #> y) = y # (rev xs)"
apply(induct_tac xs)
apply(auto)
done
theorem rev_rev [simp]: "rev(rev xs) = xs"
apply(induct_tac xs)
apply(auto)
done
end
snoc
est un opposé de cons
. Il ajoute un élément à la fin de la liste.
Je veux prouver un lemme similaire via HOLCF. Dans un premier temps, je ne considère que des listes strictes. J'ai déclaré le domaine des listes strictes dans HOLCF. J'ai aussi déclaré deux fonctions récursives:
ssnoc
- Ajoute un élément à la fin d'une listesrev
- ANNULE une liste
Prefix s
signifie "stricte".
theory Test
imports HOLCF
begin
domain 'a SList = SNil | SCons "'a" "'a SList"
fixrec ssnoc :: "'a SList → 'a → 'a SList"
where
"ssnoc ⋅ SNil ⋅ x = SCons ⋅ x ⋅ SNil" |
"ssnoc ⋅ ⊥ ⋅ x = ⊥" |
"x ≠ ⊥ ∧ xs ≠ ⊥ ⟹ ssnoc ⋅ (SCons ⋅ x ⋅ xs) ⋅ y = SCons ⋅ x ⋅ (ssnoc ⋅ xs ⋅ y)"
fixrec srev :: "'a SList → 'a SList"
where
"srev ⋅ ⊥ = ⊥" |
"srev ⋅ SNil = SNil" |
"x ≠ ⊥ ∧ xs ≠ ⊥ ⟹ srev ⋅ (SCons ⋅ x ⋅ xs) = ssnoc ⋅ (srev ⋅ xs) ⋅ x"
lemma srev_singleton [simp]:
"srev ⋅ (SCons ⋅ a ⋅ SNil) = SCons ⋅ a ⋅ SNil"
apply(induct)
apply(simp_all)
done
lemma srev_ssnoc [simp]:
"srev ⋅ (ssnoc ⋅ xs ⋅ a) = SCons ⋅ a ⋅ (srev ⋅ xs)"
apply(induct xs)
apply(simp_all)
done
lemma srev_srev [simp]:
"srev ⋅ (srev ⋅ xs) = xs"
apply(induct xs)
apply(simp_all)
done
end
Je suis en train de prouver que le double retour de la liste égale à la liste originale (lemme srev_srev
). Je l'ai déclaré deux lemmes d'aide:
srev_singleton
- inverse de la liste singleton est la liste singleton originalesrev_ssnoc
- réversion de la liste est égal à la liste à partir du dernier élément de la liste initiale annexant réversion de le reste des éléments de la liste originale
Mais je ne peux pas prouver aucun des lemmes. Pourriez-vous signaler les erreurs?
Pourquoi la condition préalable "x ≠ ⊥ ∧ xs ≠ ⊥"
est-elle nécessaire dans les définitions de fonctions? Et pourquoi devrais-je déclarer "srev ⋅ ⊥ = ⊥"
et "ssnoc ⋅ ⊥ ⋅ x = ⊥"
explicitement. Je suppose que dans HOLCF par défaut, les fonctions sont indéfinies si l'un des arguments est indéfini.
Merci pour votre réponse et pour le lien vers l'article! Mais je ne peux toujours pas prouver les lemmes même pour des listes strictes. Je pense que je me méprends sur quelque chose de trivial. J'ai ajouté des lemmes écrits dans la plaine HOL à la question. Ils sont facilement prouvés. Mais il semble que j'ai besoin de quelque chose de plus pour les prouver dans HOLCF. – Denis
@Denis: En effet vous faites. Voir ma mise à jour;) – chris
C'est ce dont j'ai besoin! Toutes ces choses liées à la rigueur des fonctions dans différents arguments et l'analyse de cas est beaucoup plus clair pour moi maintenant. Merci beaucoup! – Denis