Disons que j'ai un lemme mylem: foo ?a = bar ?a
, et je dois l'appliquer sur un objectif qui a deux occurrences de foo
, par ex. baz (foo (f p q)) (foo (g r s))
, mais seulement à l'une de ces positions. Je connais deux façons de le faire sans avoir à écrire tous les p
, q
..., qui peuvent être des expressions complexes.Méthode canonique pour obtenir un lemme plus spécifique
- Utilisation
apply (subst mylem)
suivie d'un nombre approprié (ici, zéro ou un) deback
commandes. - En utilisant
apply (subst mylem[where a = 'foo x y', standard])
, oùx
ety
sont des noms non liés.
L'utilisation de subst
ici est juste pour la démonstration; Je veux vraiment modifier le lemme, par ex. pour l'utiliser avec rule
quand il y a plusieurs correspondances possibles que je voudrais désambiguïser de cette façon.
Les deux approches ressemblent à un mauvais style pour moi. Y a-t-il une meilleure façon d'y parvenir?
Ok, qui fonctionne au niveau de la théorie, vous pouvez utiliser
lemmas
avec la clausefor
de généraliser sur les variables introduites au niveau local pour subst. Mais que faire si le je veux appliquer la règle avec, disons, «règle» et il y a plusieurs façons de l'unifier avec le but? –Je ne connaissais pas 'for' de cette façon avant. Puis-je l'utiliser dans plus de positions qu'avec "lemmes" et "interpréter (ation)"? –
Vous pouvez utiliser 'for' avec' theorems', qui est similaire à 'lemmas'; avec 'inductive' et' inductive_set' pour fixer les paramètres; et à l'intérieur des expressions locales telles qu'elles apparaissent dans 'interpret (ation)', 'sublocale', et' locale ... = ... pour ... + '. –