- Improved automata-management
- automata transformation integrated - control option strict_checking added - rudimentary tests in IsaDofApplications and Monitor_Example
This commit is contained in:
parent
456b4365f9
commit
9494c05593
48
Isa_DOF.thy
48
Isa_DOF.thy
|
@ -36,8 +36,8 @@ theory Isa_DOF (* Isabelle Document Ontology Framework *)
|
||||||
|
|
||||||
|
|
||||||
begin
|
begin
|
||||||
|
|
||||||
|
|
||||||
section\<open>Primitive Markup Generators\<close>
|
section\<open>Primitive Markup Generators\<close>
|
||||||
ML\<open>
|
ML\<open>
|
||||||
|
|
||||||
|
@ -54,9 +54,6 @@ fun docref_markup_gen refN def name id pos =
|
||||||
val docref_markup = docref_markup_gen docrefN
|
val docref_markup = docref_markup_gen docrefN
|
||||||
|
|
||||||
val docclass_markup = docref_markup_gen docclassN
|
val docclass_markup = docref_markup_gen docclassN
|
||||||
\<close>
|
|
||||||
|
|
||||||
ML\<open>
|
|
||||||
|
|
||||||
\<close>
|
\<close>
|
||||||
|
|
||||||
|
@ -570,9 +567,16 @@ val _ =
|
||||||
(Parse.opt_bang >> (fn b =>
|
(Parse.opt_bang >> (fn b =>
|
||||||
Toplevel.keep (write_ontology_latex_sty_template o Toplevel.theory_of)));
|
Toplevel.keep (write_ontology_latex_sty_template o Toplevel.theory_of)));
|
||||||
|
|
||||||
|
val (strict_monitor_checking, strict_monitor_checking_setup)
|
||||||
|
= Attrib.config_bool @{binding strict_monitor_checking} (K false);
|
||||||
|
|
||||||
end (* struct *)
|
end (* struct *)
|
||||||
|
|
||||||
\<close>
|
\<close>
|
||||||
|
|
||||||
|
setup\<open>DOF_core.strict_monitor_checking_setup\<close>
|
||||||
|
|
||||||
|
|
||||||
section\<open> Syntax for Inner Syntax Antiquotations (ISA) \<close>
|
section\<open> Syntax for Inner Syntax Antiquotations (ISA) \<close>
|
||||||
|
|
||||||
subsection\<open> Syntax \<close>
|
subsection\<open> Syntax \<close>
|
||||||
|
@ -855,7 +859,9 @@ fun calc_update_term thy cid_long (S:(string * Position.T * string * term)list)
|
||||||
end
|
end
|
||||||
in Sign.certify_term thy (fold read_assn S term) end
|
in Sign.certify_term thy (fold read_assn S term) end
|
||||||
|
|
||||||
|
fun msg thy txt = if Config.get_global thy DOF_core.strict_monitor_checking
|
||||||
|
then error txt
|
||||||
|
else warning txt
|
||||||
|
|
||||||
fun register_oid_cid_in_open_monitors oid pos cid_long thy =
|
fun register_oid_cid_in_open_monitors oid pos cid_long thy =
|
||||||
let val {monitor_tab,...} = DOF_core.get_data_global thy
|
let val {monitor_tab,...} = DOF_core.get_data_global thy
|
||||||
|
@ -864,6 +870,24 @@ fun register_oid_cid_in_open_monitors oid pos cid_long thy =
|
||||||
(DOF_core.get_accepted_cids info)
|
(DOF_core.get_accepted_cids info)
|
||||||
then SOME n
|
then SOME n
|
||||||
else NONE
|
else NONE
|
||||||
|
(* filtering those monitors with automata, whose alphabet contains the
|
||||||
|
cid of this oid. The enabled ones were selected and moved to their successor state
|
||||||
|
along the super-class id. The evaluation is in parallel, simulating a product
|
||||||
|
semantics without expanding the subclass relationship. *)
|
||||||
|
fun is_enabled_for_cid moid =
|
||||||
|
let val {accepted_cids, regexp_stack} = the(Symtab.lookup monitor_tab moid)
|
||||||
|
val indexS= 1 upto (length regexp_stack)
|
||||||
|
val indexed_autoS = regexp_stack ~~ indexS
|
||||||
|
fun check_for_cid (A,n) =
|
||||||
|
let val accS = (RegExpInterface.enabled A accepted_cids)
|
||||||
|
val is_subclass = DOF_core.is_subclass_global thy
|
||||||
|
val idx = find_index (is_subclass cid_long) accS
|
||||||
|
in if idx < 0
|
||||||
|
then (msg thy ("monitor "^moid^"(" ^ Int.toString n
|
||||||
|
^") not enabled for doc_class: "^cid_long);A)
|
||||||
|
else RegExpInterface.next A accepted_cids (nth accS idx)
|
||||||
|
end
|
||||||
|
in (moid,map check_for_cid indexed_autoS) end
|
||||||
val enabled_monitors = List.mapPartial is_enabled (Symtab.dest monitor_tab)
|
val enabled_monitors = List.mapPartial is_enabled (Symtab.dest monitor_tab)
|
||||||
fun markup2string x = XML.content_of (YXML.parse_body x)
|
fun markup2string x = XML.content_of (YXML.parse_body x)
|
||||||
fun conv_attrs (((lhs, pos), opn), rhs) = (markup2string lhs,pos,opn,
|
fun conv_attrs (((lhs, pos), opn), rhs) = (markup2string lhs,pos,opn,
|
||||||
|
@ -874,9 +898,18 @@ fun register_oid_cid_in_open_monitors oid pos cid_long thy =
|
||||||
fun def_trans oid = #1 o (calc_update_term thy (cid_of oid) assns')
|
fun def_trans oid = #1 o (calc_update_term thy (cid_of oid) assns')
|
||||||
val _ = if null enabled_monitors then () else writeln "registrating in monitors ..."
|
val _ = if null enabled_monitors then () else writeln "registrating in monitors ..."
|
||||||
val _ = app (fn n => writeln(oid^" : "^cid_long^" ==> "^n)) enabled_monitors;
|
val _ = app (fn n => writeln(oid^" : "^cid_long^" ==> "^n)) enabled_monitors;
|
||||||
in thy |> fold (fn mon_oid => DOF_core.update_value_global mon_oid (def_trans mon_oid))(enabled_monitors)
|
(* check that any transition is possible : *)
|
||||||
|
val delta_autoS = map is_enabled_for_cid enabled_monitors;
|
||||||
|
fun update_info (n, aS) (tab: DOF_core.monitor_tab) =
|
||||||
|
let val {accepted_cids,regexp_stack} = the(Symtab.lookup tab n)
|
||||||
|
in Symtab.update(n, {accepted_cids=accepted_cids, regexp_stack=aS}) tab end
|
||||||
|
fun update_trace mon_oid = DOF_core.update_value_global mon_oid (def_trans mon_oid)
|
||||||
|
val update_automatons = DOF_core.upd_monitor_tabs(fold update_info delta_autoS)
|
||||||
|
in thy |> fold (update_trace) (enabled_monitors)
|
||||||
|
|> DOF_core.map_data_global(update_automatons)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
fun create_and_check_docitem is_monitor oid pos cid_pos doc_attrs thy =
|
fun create_and_check_docitem is_monitor oid pos cid_pos doc_attrs thy =
|
||||||
let val id = serial ();
|
let val id = serial ();
|
||||||
val _ = Position.report pos (docref_markup true oid id pos);
|
val _ = Position.report pos (docref_markup true oid id pos);
|
||||||
|
@ -1270,6 +1303,7 @@ fun calculate_trace ctxt oid pos =
|
||||||
val print_string_pair = ML_Syntax.print_pair ML_Syntax.print_string ML_Syntax.print_string
|
val print_string_pair = ML_Syntax.print_pair ML_Syntax.print_string ML_Syntax.print_string
|
||||||
in ML_Syntax.print_list print_string_pair string_pair_list end
|
in ML_Syntax.print_list print_string_pair string_pair_list end
|
||||||
|
|
||||||
|
|
||||||
val _ = Theory.setup
|
val _ = Theory.setup
|
||||||
(ML_Antiquotation.inline @{binding trace_attribute}
|
(ML_Antiquotation.inline @{binding trace_attribute}
|
||||||
(fn (ctxt,toks) =>
|
(fn (ctxt,toks) =>
|
||||||
|
|
18
RegExp.thy
18
RegExp.thy
|
@ -87,24 +87,6 @@ export_code zero one Suc Int.nat nat_of_integer int_of_integer
|
||||||
|
|
||||||
SML_file "RegExpChecker.sml"
|
SML_file "RegExpChecker.sml"
|
||||||
|
|
||||||
ML\<open> open RegExpChecker;\<close>
|
|
||||||
|
|
||||||
(*
|
|
||||||
ML{* use "RegExpChecker.sml"; open RegExpChecker;
|
|
||||||
|
|
||||||
val eq_int = {equal = curry(op =) : int -> int -> bool};
|
|
||||||
val eq_bool_list = {equal = curry(op =) : bool list -> bool list -> bool};
|
|
||||||
val eq_mynat = {equal = fn x:RegExpChecker.nat => fn y => x = y}
|
|
||||||
val s = RegExpChecker.rexp2na eq_int;
|
|
||||||
val xxx = na2da eq_mynat;
|
|
||||||
val ((init), (next,fin)) = na2da eq_bool_list (RegExpChecker.rexp2na eq_mynat example_expression);
|
|
||||||
val Set X = next zero init;
|
|
||||||
val Set Y = next one init;
|
|
||||||
val Set Z = next (Suc one) init;
|
|
||||||
*}
|
|
||||||
*)
|
|
||||||
|
|
||||||
|
|
||||||
no_notation Atom ("\<lfloor>_\<rfloor>")
|
no_notation Atom ("\<lfloor>_\<rfloor>")
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,7 @@ begin
|
||||||
open_monitor*[this::article]
|
open_monitor*[this::article]
|
||||||
(*>*)
|
(*>*)
|
||||||
|
|
||||||
|
declare[[strict_monitor_checking=false]]
|
||||||
title*[tit::title]\<open>Using the Isabelle Ontology Framework\<close>
|
title*[tit::title]\<open>Using the Isabelle Ontology Framework\<close>
|
||||||
subtitle*[stit::subtitle]\<open>Linking the Formal with the Informal\<close>
|
subtitle*[stit::subtitle]\<open>Linking the Formal with the Informal\<close>
|
||||||
text*[adb:: author,
|
text*[adb:: author,
|
||||||
|
|
|
@ -16,7 +16,7 @@ val term = @{term "(title ~~
|
||||||
|
|
||||||
ML\<open>
|
ML\<open>
|
||||||
val alpha = (RegExpInterface.alphabet [term]);
|
val alpha = (RegExpInterface.alphabet [term]);
|
||||||
val DA as (init,(next,fin)) = RegExpInterface.rexp_term2da term (RegExpInterface.alphabet [term]) ;
|
val DA as (init,(next,fin)) = RegExpInterface.rexp_term2da (RegExpInterface.alphabet [term]) term ;
|
||||||
RegExpChecker.accepts DA [0,2,3,4,5,6,7,8];
|
RegExpChecker.accepts DA [0,2,3,4,5,6,7,8];
|
||||||
\<close>
|
\<close>
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue