Widzę różne możliwości, zależy to trochę od kontekstu aplikacji, co jest najlepsze. Zauważ, że na ogół indywidualny kod ML dla dowodu zautomatyzowanego był zwykłym miejscem w dawnych czasach, ale dziś jest stosunkowo rzadki. Na przykład porównaj liczbę niestandardowych taktyk w raczej małym numerze HOL-Bali (rozpoczętym w 1997 r.) Z dużym JinjaThreads w AFP (rozpoczęty w 2007 r. I kontynuowany do niedawna).
Zagnieżdżanie antytokacji ML, takich jak @{tactic}
, z zasady zadziałałoby, ale szybko natknąłbyś się na dalsze pytania, np. Co się stanie, jeśli argumenty teorematyczne będą znowu źródłem Isar lub ML.
Zamiast antiquoting taktyczne cegiełki w ml, bardziej podstawowe podejście jest cytatem dowód precedure w Isar poprzez nadanie mu regularne składni metody tak:
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)))
*}
Tutaj mam pierwszy utworzyłem standardową definicję foo_tac
w Isabelle/ML, a następnie zapakowałem ją w zwykły sposób Isar jako metodę sprawdzającą. To ostatnie oznacza, że masz opakowania takie jak SIMPLE_METHOD
, które zajmują się wypychaniem "przykutych faktów" do stanu docelowego, oraz CHANGED
, aby zapewnić postęp procesu Isar (np. simp
lub auto
).
Przykład foo_tac
zakłada, że modyfikacja kontekstu (lub jego Simpset) jest stała, według sztywnych reguł podziału. Jeśli chcesz mieć dalsze parametry, możesz to uwzględnić w składni konkretnej metody. Zauważ, że Method.sections
jest już dość wyrafinowany pod tym względem. Więcej podstawowych analizatorów argumentów podano w rozdziale "Definiowanie metod sprawdzania" w podręczniku isar-ref. Powinieneś także przyjrzeć się istniejącym przykładom, szukając źródeł dla method_setup
(w Isabelle/Isar) lub Method.setup
(w Isabelle/ML).
Jeśli nadal chcesz zrobić ML antiquotations zamiast konkretnej składni metody, można wypróbować wariant @{context}
który pozwala modyfikatory tak:
@{context simp add: ...}
To jest nieco spekulacyjny, wymyślone na poczekaniu, a może okazać się złą praktyką. Jak już powiedziałem, precyzyjne programowanie taktyki w Isabelle stało się w ostatnich latach nieco niecelowe, chociaż ML jest integralną częścią struktury Isabelle. Jeśli stawiasz bardziej konkretne pytanie z większą ilością kontekstu aplikacji, możemy ponownie rozważyć podejście antydotywacyjne.
Możesz zajrzeć do kodu 'try0'. AFAIK, podoba mi się to, co proponujesz z anty-cytatem. –
@LarsNoschinski: 'try0' początkowo wyglądało obiecująco, ale niestety działa przy użyciu obiektów stanu dowodu (" stan "), które wciąż nie mogą być używane w sytuacji, w której wymagana jest' taktyka '. Możliwym rozwiązaniem może być wstrzyknięcie częściowo sprawdzonego "thm" w nowy obiekt stanu dowodu, zastosowanie do niego metody, a następnie wyodrębnienie wyniku; niestety wydaje się, że nie ma również oczywistego mechanizmu, aby to zrobić. – davidg
Z kilkoma pytaniami, odpowiedziami i komentarzami rozłożonymi na nich, robi się nieco trudnym do naśladowania. Lepiej rozpoczynaj prostą dyskusję na liście dyskusyjnej w 'isabelle-users'. – Makarius