Theory Unify_Assumption_Tactic
theory Unify_Assumption_Tactic
imports
Unify_Assumption_Tactic_Base
ML_Unifiers
begin
paragraph ‹Summary›
text ‹Setup of assumption tactic and examples.›
ML‹
@{functor_instance struct_name = Standard_Unify_Assumption
and functor_name = Unify_Assumption
and id = ‹""›
and more_args = ‹val init_args = {
normalisers = SOME Standard_Mixed_Unification.norms_first_higherp_decomp_comb_higher_unify,
unifier = SOME Standard_Mixed_Unification.first_higherp_decomp_comb_higher_unify
}›}
›
local_setup ‹Standard_Unify_Assumption.setup_attribute NONE›
local_setup ‹Standard_Unify_Assumption.setup_method NONE›
paragraph ‹Examples›
experiment
begin
lemma "PROP P ⟹ PROP P"
by uassm
lemma
assumes h: "⋀P. PROP P"
shows "PROP P x"
using h by uassm
schematic_goal "⋀x. PROP P (c :: 'a) ⟹ PROP ?Y (x :: 'a)"
by uassm
schematic_goal a: "PROP ?P (y :: 'a) ⟹ PROP ?P (?x :: 'a)"
by uassm
schematic_goal
"PROP ?P (x :: 'a) ⟹ PROP P (?x :: 'a)"
by uassm
schematic_goal
"⋀x. PROP D ⟹ (⋀P y. PROP P y x) ⟹ PROP C ⟹ PROP P x"
by (uassm unifier = Higher_Order_Unification.unify)
text ‹Unlike @{method assumption}, @{method uassm} will not close the goal if the order of premises
of the assumption and the goal are different. Compare the following two examples:›
lemma "⋀x. PROP D ⟹ (⋀y. PROP A y ⟹ PROP B x) ⟹ PROP C ⟹ PROP A x ⟹ PROP B x"
by uassm
lemma "⋀x. PROP D ⟹ (⋀y. PROP A y ⟹ PROP B x) ⟹ PROP A x ⟹ PROP C ⟹ PROP B x"
by assumption
end
end