ich eine Vielzahl von Möglichkeiten zu sehen, es hängt ein wenig von dem Kontext Ihrer Anwendung, was am besten ist. Beachten Sie, dass im Allgemeinen der individuelle ML-Code für den automatisierten Beweis in den sehr alten Zeiten üblich war, aber heute ist er relativ selten. Man vergleiche beispielsweise die Menge an individueller Taktik in eher kleinen HOL-Bali (seit 1997) mit den großen JinjaThreads in AFP (begann 2007 und dauerte bis vor kurzem).
Nesting ML Antiquitierungen wie @{tactic}
würde im Prinzip funktionieren, aber Sie würden schnell auf weitere Fragen stoßen, wie was passiert, wenn Ihre Theorem Argumente wieder Isar oder ML-Quelle sein sollte.
Statt antiquoting Taktik Bausteine in ML, ein grundlegenden Ansatz ist zu Zitat Ihr Beweis precedure in Isar durch reguläre Methode Syntax wie folgt geben:
ML {*
(*foo_tac -- the payload of what you want to do,
note the dependency on ctxt: Proof.context*)
fun foo_tac ctxt =
let
val my_ctxt =
ctxt |> Simplifier.map_simpset
(fold Splitter.add_split @{thms prod.splits} #>
Simplifier.add_simp @{thm split_def})
in ALLGOALS (clarsimp_tac my_ctxt) end
*}
method_setup foo = {*
(*concrete syntax like "clarsimp", "auto" etc.*)
Method.sections Clasimp.clasimp_modifiers >>
(*Isar method boilerplate*)
(fn _ => fn ctxt => SIMPLE_METHOD (CHANGED (foo_tac ctxt)))
*}
Hier habe ich zum ersten Mal eine herkömmliche foo_tac
Definition in Isabelle/ml und wickelte es dann auf die übliche Art und Weise als Beweis Isar Verfahren auf. Letzteres bedeutet, dass Sie Wrapper wie SIMPLE_METHOD
drängen „gekettet Fakten“ in den Zielzustand kümmert, und CHANGED
, um sicherzustellen, dass die Isar Methode Fortschritte macht (wie simp
oder auto
).
Das Beispiel foo_tac
geht davon aus, dass Ihre Änderung des Kontexts (oder seines Simpset) durch die festverdrahteten Split-Regeln konstant ist. Wenn Sie dort weitere Parameter haben wollen, können Sie das in die konkrete Methoden-Syntax aufnehmen. Beachten Sie, dass Method.sections
in dieser Hinsicht bereits ziemlich ausgereift ist. Weitere grundlegende Argumentparser sind im Abschnitt "Definieren von Prüfmethoden" des Handbuchs isar-ref beschrieben. Sie sollten auch an vorhandenen Beispielen suchen, indem Sie die Quellen für method_setup
(in Isabelle/Isar) oder Method.setup
(in Isabelle/ML) zu suchen.
Wenn Sie noch ML wollen antiquotations statt konkreter Methode Syntax zu tun, man eine Variante von @{context}
versuchen könnte, die Modifikatoren wie dies ermöglicht:
@{context simp add: ...}
, die ein wenig spekulativ ist, an Ort und Stelle erfunden, und könnte sich als schlechte Praxis herausstellen. Wie ich gesagt habe, wurde feinkörnige Taktik Programmierung in Isabelle ein wenig aus der Nutzung in der letzten Jahren, obwohl ML ein integraler Bestandteil des Isabelle Rahmen ist. Wenn Sie eine konkretere Frage mit mehr Anwendungskontext stellen, können wir den Antiquotationsansatz überdenken.
Vielleicht möchten Sie in den Code von 'try0' schauen. AFAIK, es macht einen ähnlichen Trick zu dem, was Sie mit Ihrem Anti-Zitat vorschlagen. –
@LarsNoschinski: "try0" sah zunächst vielversprechend aus, arbeitet aber leider mit Proof-State ('state') Objekten, die in einer Situation, in der eine' Taktik' gefordert ist, immer noch nicht verwendet werden können. Ein möglicher Ansatz könnte darin bestehen, ein teilweise bewiesenes "thm" in ein neues Beweisstatusobjekt zu injizieren, eine Methode darauf anzuwenden und dann das Ergebnis zu extrahieren; Leider scheint es auch keinen offensichtlichen Mechanismus dafür zu geben. – davidg
Mit einigen Fragen und Antworten und Kommentare über sie verteilt, wird es ein bisschen schwierig zu folgen. Beginnen Sie lieber eine alteingesessene Mailinglistendiskussion bei 'isabelle-users'. – Makarius