(* * Copyright 2014, NICTA * * This software may be distributed and modified according to the terms of * the GNU General Public License version 2. Note that NO WARRANTY is provided. * See "LICENSE_GPLv2.txt" for details. * * @TAG(NICTA_GPL) *) theory Sep_Tactic_Examples imports "SepDSpec.Sep_Tactic_Helper" KHeap_DP begin (* Thesis : Automated Tactics for Seperation Logic *) (* seperation logic *) (* after we show that addition and disjointedness on our heap obeys certain laws, we get a seperation algebra *) (* connectives *) term "P \* Q" term "P \* Q" lemma frame_rule: "\R. \P\ f \\_. Q\ \ \P \* R\ f \\_. Q \* R\" oops thm swap_cap_wp[no_vars] lemma "\c - \* src \c cap \* R>\ move_cap cap' src dest \\_. c cap' \* src \c NullCap \* R>\" apply (simp add: move_cap_def) apply (wp swap_parents_wp set_cap_wp) (* set_cap doesn't apply *) thm set_cap_wp[no_vars] apply (rule hoare_strengthen_post) apply (wp set_cap_wp) apply (clarsimp simp: sep_conj_ac ) oops (* tactics we had pre-thesis *) lemma "(A \* B \* C \* D) s \ (A \* B \* C \* D) s" apply (sep_select 4) apply (sep_select_asm 3) apply (sep_select 2) apply (sep_cancel) apply (sep_cancel) apply (sep_cancel) done (* forward reasoning *) lemma example_drule: "(ptr \o obj) s \ (ptr \S obj \* ptr \f obj) s" by (metis sep_conj_commute sep_map_o_decomp) lemma sep_drule_example: "(ptr \o obj \* A \* B ) s \ (A \* B \* ptr \f obj \* ptr \S obj) s" apply (sep_drule example_drule) apply (sep_solve) done (* backwards reasoning *) lemma example_rule: "(ptr \f obj \* ptr \S obj) s \ (ptr \o obj) s" by (metis sep_map_o_decomp) lemma sep_rule_example: "(ptr \f obj \* A \* B \* ptr \S obj ) s \ (ptr \o obj \* A \* B) s" apply (sep_rule example_rule) apply (sep_solve) done (* the state of proving before new stuff *) lemma swap_cap_wp_old: "\c cap \* src \c cap' \* R>\ swap_cap cap' src cap dest \\_.c cap' \* src \c cap \* R>\" apply (clarsimp simp add: swap_cap_def) apply (wp swap_parents_wp set_cap_wp) apply (rule hoare_chain) apply (rule set_cap_wp) apply (sep_solve)+ done lemma move_cap_wp_old: "\c - \* src \c cap \* R>\ move_cap cap' src dest \\_. c cap' \* src \c NullCap \* R>\" including no_pre apply (simp add: move_cap_def) apply (wp swap_parents_wp) apply (rule hoare_strengthen_post) apply (rule set_cap_wp) apply (sep_select 2) apply (sep_solve) apply (rule hoare_chain) apply (rule insert_cap_orphan_wp) apply (sep_solve) apply (sep_solve) done lemma invoke_cnode_rotate2_wp_old: "(dest) \ (rnd) \ \c cap1 \* src \c cap2 \* rnd \c - \* R>\ invoke_cnode (RotateCall cap1 cap2 dest src rnd) \\_. c NullCap \* src \c cap1 \* rnd \c cap2 \* R>\" including no_pre apply (clarsimp simp: invoke_cnode_def) apply (wp) apply (rule hoare_strengthen_post) apply (rule move_cap_wp) apply (sep_solve ) apply (rule hoare_chain) apply (rule move_cap_wp) apply (sep_select_asm 2, sep_select_asm 3) apply (sep_solve) apply (sep_solve) done (* new sep_select/asm *) lemma "(A \* B \* C \* D) s \ (A \* B \* C \* D) s" apply (sep_select 4 3 2 1) apply (sep_select_asm 4 3 2 1) apply (sep_select_asm 2 4) oops (* sep_select_pre/post *) lemma "\A \* B \* C \* D\ f \\_. A \* B \* C \* D\" apply (sep_select_pre 4 1 2 3) apply (sep_select_post 3 4 2 1) apply (sep_select_post 3 4) oops (* can be made to work for arbitrary monads *) lemma "\A \* B \* C \* D\ f \\_. A \* B \* C \* D\, \E\" apply (sep_select_pre 4 1 2 3) apply (sep_select_post 3 4 2 1) apply (sep_select_post 3 4) oops lemma "\A \* B \* C \* D\ f \\_. A \* B \* C \* D\, -" apply (sep_select_pre 4 1 2 3) apply (sep_select_post 3 4 2 1) apply (sep_select_post 3 4) oops lemma "(P \* (P \* Q)) s \ Q s" apply (sep_mp, assumption ) done lemma "P s \ (Q \* (P \* Q)) s" apply (erule sep_curry[rotated]) apply (assumption) done thm sep_mp[no_vars] sep_curry[rotated, no_vars] (* wp tactic testing *) (* sep_wand approach *) method_setup debug = {* Attrib.thms >> (fn _ => fn ctxt => let val wp_pre_tac = SELECT_GOAL (Method.NO_CONTEXT_TACTIC ctxt (Method_Closure.apply_method ctxt @{method wp_pre} [] [] [] ctxt [])) in SIMPLE_METHOD' (CHANGED o wp_pre_tac) end ) *} lemma move_cap_wp2: "\c - \* src \c cap \* R>\ move_cap cap' src dest \\_. c cap' \* src \c NullCap \* R>\" apply (simp add: move_cap_def) apply (sep_wp set_cap_wp swap_parents_wp insert_cap_orphan_wp)+ apply (sep_solve) done lemma swap_cap_wp2: "\c cap \* src \c cap' \* R>\ swap_cap cap' src cap dest \\_.c cap' \* src \c cap \* R>\" apply (clarsimp simp: swap_cap_def) apply (sep_wp swap_parents_wp set_cap_wp)+ apply (sep_solve) done lemma invoke_cnode_rotate2_wp: "(dest) \ (rnd) \ \c cap1 \* src \c cap2 \* rnd \c - \* R>\ invoke_cnode (RotateCall cap1 cap2 dest src rnd) \\_. c NullCap \* src \c cap1 \* rnd \c cap2 \* R>\" apply (clarsimp simp: invoke_cnode_def) apply (sep_wp move_cap_wp)+ apply (sep_solve) done (* sep_drule/rule *) lemma sep_rule_example2: "\(ptr \o obj) s; finite (dom (object_slots obj))\ \ (ptr \E obj \* ptr \f obj \* (\* slot\dom (object_slots obj). (ptr, slot) \s obj)) s" apply (subst (asm) sep_map_o_decomp) apply (subst (asm) sep_map_S_decomp, simp+) apply sep_solve done lemma sep_drule_example2: "\(ptr \f obj \* (\* slot\dom (object_slots obj). (ptr, slot) \s obj) \* ptr \E obj) s; finite (dom (object_slots obj))\ \ (ptr \o obj) s" by (metis sep_map_S_decomp sep_map_o_decomp) (* sep_curry *) lemma sep_drule_example_lemma: "\(H \* Z \* J \* L \* Y \* ptr \f obj \* A \* B \* (\* slot\dom (object_slots obj). (ptr, slot) \s obj) \* D \* G \* E \* F \* ptr \E obj ) s; finite (dom (object_slots obj))\ \ (D \* G \* E \* F \* ptr \o obj \* H \* Z \* J \* L \* Y \* A \* B) s" apply (sep_drule sep_drule_example2) apply assumption apply sep_solve done (* sep_back *) lemma sep_rule_example_lemma: "\(H \* Z \* J \* L \* Y \* ptr \o obj \* A \* B \* D \* G \* E \* F ) s; finite (dom (object_slots obj))\ \ (D \* G \* E \* F \* ptr \f obj \* H \* Z \* J \* L \* Y \* ptr \E obj \* A \* B \* (\* slot\dom (object_slots obj). (ptr, slot) \s obj)) s" apply (sep_rule sep_rule_example2) apply sep_solve apply assumption done (* works even with multiple conjuncts in assumptions and conclusions *) lemma sep_rule_double_conjunct_example: "\((obj_id, slot) \c cap \* obj_id \f obj) s; object_slots obj slot = Some cap\ \ ((obj_id, slot) \s obj \* obj_id \f obj) s" apply (sep_drule sep_map_s_sep_map_c) apply assumption apply (sep_cancel)+ done lemma sep_rule_double_conjunct_lemma: "\(H \* Z \* J \* L \* Y \* obj_id \f obj \* A \* B \* D \* G \* E \* F \* (obj_id, slot) \c cap ) s; object_slots obj slot = Some cap\ \ (D \* G \* E \* F \*(obj_id, slot) \s obj \* H \* Z \* J \* L \* Y \* A \* B \* obj_id \f obj) s" apply (sep_rule sep_rule_double_conjunct_example) apply sep_solve apply assumption done (* side-conditions*) lemma sep_drule_side_condition_lemma: "\(H \* Z \* J \* L \* Y \* obj_id \f obj \* A \* B \* D \* G \* E \* F \* (obj_id, slot) \c cap ) s; object_slots obj slot = Some cap\ \ (D \* G \* E \* F \*(obj_id, slot) \s obj \* H \* Z \* J \* L \* Y \* A \* B \* obj_id \f obj) s" apply (sep_drule sep_rule_double_conjunct_example, assumption) apply (sep_solve) done schematic_goal "(P \* ?A) s \ (A \* B \* P) s" apply (sep_solve) done end