include "LTL/LTL.ma". include "LIN/LIN.ma". include "utilities/BitVectorTrieSet.ma". include "common/Graphs.ma". axiom LTLTag: String. definition translate_statement: ∀globals. ltl_statement globals → pre_lin_statement globals ≝ λglobals: list ident. λs: ltl_statement globals. match s with [ joint_st_return ⇒ joint_st_return ? globals | joint_st_sequential instr _ ⇒ joint_st_sequential ? globals instr it | joint_st_goto lbl ⇒ joint_st_goto ? globals lbl ]. definition require: ident → BitVectorTrieSet 16 → BitVectorTrieSet 16 ≝ λl: ident. λg: BitVectorTrieSet 16. set_insert ? (word_of_identifier ? l) g. definition mark: ident → BitVectorTrieSet 16 → BitVectorTrieSet 16 ≝ λl: ident. λg: BitVectorTrieSet 16. set_insert ? (word_of_identifier ? l) g. definition marked: ident → BitVectorTrieSet 16 → bool ≝ λl: ident. λg: BitVectorTrieSet 16. set_member ? (word_of_identifier ? l) g. (* alias id "lookupn" = "cic:/matita/cerco/common/Identifiers/lookup.def(3)". *) definition graph_lookup ≝ λglobals: list ident. λl: ident. λgr: ltl_statement_graph globals. lookup LabelTag ? gr (an_identifier LabelTag (word_of_identifier ? l)). definition fetch: ∀globals: list ident. ident → ltl_statement_graph globals → option (ltl_statement globals) ≝ λglobals: list ident. λl: ident. λg: ltl_statement_graph globals. graph_lookup globals l g. definition foo ≝ λl2, visited, required, globals, generated, g, n. λvisit: ∀globals: list Identifier. ∀g: LTLStatementGraph globals. ∀required: BitVectorTrieSet 16. ∀visited: BitVectorTrieSet 16. ∀generated: list (PreLINStatement globals). ∀l: Identifier. ∀n: nat. BitVectorTrieSet 16 × (list (PreLINStatement globals)). if marked l2 visited then 〈require l2 required, (Joint_St_Goto ? globals l2) :: generated〉 else visit globals g required visited generated l2 n. let rec visit (globals: list ident) (g: ltl_statement_graph globals) (required: BitVectorTrieSet 16) (visited: BitVectorTrieSet 16) (generated: list (pre_lin_statement globals)) (l: ident) (n: nat) on n: BitVectorTrieSet 16 × (list (PreLINStatement globals)) ≝ match n with [ O ⇒ 〈required, generated〉 | S n' ⇒ let visited' ≝ mark l visited in match fetch globals l g with [ None ⇒ 〈required, generated〉 (* dpm: correct? *) | Some statement ⇒ let translated_statement ≝ translate_statement globals statement in let generated'' ≝ translated_statement :: generated in match statement with [ joint_st_sequential instr l2 ⇒ match instr with [ joint_instr_cond_acc l1 ⇒ let required' ≝ if marked l2 visited' then require l2 required else required in let 〈required', generated''〉 ≝ foo l2 visited' required' globals generated'' g n' visit (* if marked l2 visited' then 〈required', (Joint_St_Goto ? globals l2) :: generated''〉 else visit globals g required' visited' generated'' l2 n'*) in let required'' ≝ require l1 required' in if ¬(marked l1 visited') then visit globals g required'' visited' generated'' l1 n' else 〈required', generated''〉 | _ ⇒ let required' ≝ if marked l2 visited' then require l2 required else required in if marked l2 visited' then 〈required', Joint_St_Goto ? globals l2 :: generated''〉 else visit globals g required' visited' generated'' l2 n' ] | joint_st_goto lbl ⇒ let required' ≝ if marked lbl visited' then require lbl required else required in if marked lbl visited' then 〈required', (Joint_St_Goto ? globals lbl) :: generated''〉 else visit globals g required' visited' generated'' lbl n' | joint_st_Return ⇒ 〈required, generated''〉 (* dpm: correct? *) ] ] ]. (* definition translate_graph ≝ λglobals: list Identifier. λg: LTLStatementGraph globals. λentry: Identifier. let visited ≝ set_empty ? in let required ≝ set_insert ? entry (set_empty ?) in let 〈required', translated〉 ≝ visit globals g required visited [ ] entry in let reversed ≝ rev ? translated in filter (λs: PreLINStatement globals. ?) reversed. *)