LRI
Équipe VALS
Bât 650 Ada Lovelace, Université Paris Sud
Rue Noetzlin, 91190 Gif-sur-Yvette, France
Isabelle club meeting on March 2 2016

Personnes présentes

  • Frédéric Boulanger
  • Chantal Keller
  • Yakoub Nemouchi
  • Safouan Taha
  • Frédéric Tuong
  • Burkhart Wolff

Preuve avec double induction

Safouan TAHA

Safouan présente un début de formalisation en Isabelle des patrons de propriétés temporelles. Il s'agit d'une sémantique dénotationnelle basée sur des traces finis.

Une des primitives formalisées subchain prend en paramètre :

  • une trace : une liste finie d'états
  • une liste de propriétés : une propriété est une fonction booléenne sur l'ensemble des états

et vérifie si les propriétés sont vérifiées par les états de la trace dans l'ordre. Les états vérifiant les propriétés ne sont pas nécessairement contigus et un seul état peut vérifier à lui seul une sous-séquence de la liste de propriétés.

fun subchain :: "'state list ⇒ ('state ⇒ bool) list ⇒ bool"
  where 
    "subchain _ [] = True"
  | "subchain [] (φ#φl) = False"
  | "subchain (ε#ξ) (φ#φl) = (if (φ ε) 
                                  then subchain (ε#ξ) φl
                                  else subchain ξ (φ#φl))" 

Un lemme qui semble trivial est:

lemma "subchain ξ (φ#φl) ⟶ subchain ξ φl"
apply(induct ξ, simp)
apply(rule impI, simp)
apply(case_tac "φ a", simp_all)
apply(thin_tac "subchain ξ (φ # φl)", thin_tac "¬ φ a")
oops

en entamant la preuve par induction de ce lemme, on découvre qu'on a besoin d'un lemme dual tout aussi trivial:

lemma "subchain ξ φl ⟶ subchain (ε#ξ) φl"

sauf que la preuve de ce lemme nécessite à son tour le premier lemme. les deux lemmes sont inter-dépendants. Il faudra prouver les deux en même temps. D'où le lemme:

lemma "(subchain ξ (φ#φl) ⟶ subchain ξ φl) ∧ (subchain ξ φl ⟶ subchain (ε#ξ) φl)"

De nouveau la preuve par induction sur une des deux listes ξ ou φl n'aboutit pas à l'hypothèse d'induction. On a besoin d'une double induction (proposée par Chantal) sur la somme des longueurs des deux listes:

lemma "n = length ξ + length φl ⟶ ((subchain ξ (φ#φl) ⟶ subchain ξ φl) 
                                  ∧ (subchain ξ φl ⟶ subchain (ε#ξ) φl))"

sous cette forme la preuve aboutie.

En exercice une seconde formalisation de subchain est discutée:

function subchain_v2 :: "'state list ⇒ ('state ⇒ bool) list ⇒ bool"
  where 
    "subchain_v2 _ [] = True"
  | "subchain_v2 [] (φ#φl) = False"
  | "subchain_v2 (ε#ξ) (φ#φl) = (if (φ ε) 
                                  then subchain_v2 ξ (dropWhile (λ φ. φ ε) φl)
                                  else subchain_v2 (dropWhile (λ ε. ¬ φ ε) ξ) φl)"                            
apply(simp_all)
apply(case_tac x, simp, case_tac b, simp, case_tac a, simp_all)
done
termination
apply(relation "measure (λ(a,b). length a)")
apply(simp_all)
apply(simp add: le_imp_less_Suc length_dropWhile_le)
done

Il reste à prouver le lemme suivant:

lemma "subchain ξ φl = subchain_v2 ξ φl"


Previous meeting -- Next meeting