src/HOL/Prolog/HOHH.ML
author oheimb
Fri, 02 Jun 2000 12:44:04 +0200
changeset 9015 8006e9009621
child 13208 965f95a3abd9
permissions -rw-r--r--
added HOL/Prolog
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
9015
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
     1
open HOHH;
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
     2
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
     3
exception not_HOHH;
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
     4
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
     5
fun isD t = case t of 
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
     6
    Const("Trueprop",_)$t     => isD t
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
     7
  | Const("op &"  ,_)$l$r     => isD l andalso isD r
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
     8
  | Const("op -->",_)$l$r     => isG l andalso isD r
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
     9
  | Const(   "==>",_)$l$r     => isG l andalso isD r
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    10
  | Const("All",_)$Abs(s,_,t) => isD t
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    11
  | Const("all",_)$Abs(s,_,t) => isD t
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    12
  | Const("op |",_)$_$_       => false
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    13
  | Const("Ex" ,_)$_          => false
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    14
  | Const("not",_)$_          => false
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    15
  | Const("True",_)           => false
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    16
  | Const("False",_)          => false
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    17
  | l $ r                     => isD l
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    18
  | Const _ (* rigid atom *)  => true
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    19
  | Bound _ (* rigid atom *)  => true
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    20
  | Free  _ (* rigid atom *)  => true
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    21
  | _    (* flexible atom,
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    22
	    anything else *)  => false
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    23
and
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    24
    isG t = case t of
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    25
    Const("Trueprop",_)$t     => isG t
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    26
  | Const("op &"  ,_)$l$r     => isG l andalso isG r
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    27
  | Const("op |"  ,_)$l$r     => isG l andalso isG r
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    28
  | Const("op -->",_)$l$r     => isD l andalso isG r
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    29
  | Const(   "==>",_)$l$r     => isD l andalso isG r
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    30
  | Const("All",_)$Abs(_,_,t) => isG t
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    31
  | Const("all",_)$Abs(_,_,t) => isG t
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    32
  | Const("Ex" ,_)$Abs(_,_,t) => isG t
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    33
  | Const("True",_)           => true
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    34
  | Const("not",_)$_          => false
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    35
  | Const("False",_)          => false
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    36
  | _ (* atom *)	      => true;
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    37
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    38
val check_HOHH_tac1 = PRIMITIVE (fn thm => 
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    39
	if isG (concl_of thm) then thm else raise not_HOHH);
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    40
val check_HOHH_tac2 = PRIMITIVE (fn thm => 
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    41
	if forall isG (prems_of thm) then thm else raise not_HOHH);
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    42
fun check_HOHH thm  = (if isD (concl_of thm) andalso forall isG (prems_of thm) 
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    43
			then thm else raise not_HOHH);
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    44
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    45
fun atomizeD thm = let 
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    46
    fun at  thm = case concl_of thm of
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    47
      _$(Const("All" ,_)$Abs(s,_,_))=> at(thm RS (read_instantiate [("x",
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    48
					"?"^(if s="P" then "PP" else s))] spec))
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    49
    | _$(Const("op &",_)$_$_)       => at(thm RS conjunct1)@at(thm RS conjunct2)
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    50
    | _$(Const("op -->",_)$_$_)     => at(thm RS mp)
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    51
    | _				    => [thm]
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    52
in map zero_var_indexes (at thm) end;
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    53
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    54
val atomize_ss = empty_ss setmksimps (mksimps mksimps_pairs) addsimps [
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    55
	all_conj_distrib, (* "(! x. P x & Q x) = ((! x. P x) & (! x. Q x))" *)
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    56
	imp_conjL RS sym, (* "(D :- G1 :- G2) = (D :- G1 & G2)" *)
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    57
	imp_conjR,	  (* "(D1 & D2 :- G) = ((D1 :- G) & (D2 :- G))" *)
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    58
	imp_all];	  (* "((!x. D) :- G) = (!x. D :- G)" *)
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    59
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    60
(*val hyp_resolve_tac = METAHYPS (fn prems => 
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    61
				  resolve_tac (flat (map atomizeD prems)) 1);
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    62
  -- is nice, but cannot instantiate unknowns in the assumptions *)
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    63
fun hyp_resolve_tac i st = let
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    64
	fun ap (Const("All",_)$Abs(_,_,t))=(case ap t of (k,a,t) => (k+1,a  ,t))
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    65
	|   ap (Const("op -->",_)$_$t)    =(case ap t of (k,_,t) => (k,true ,t))
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    66
	|   ap t			  = 			    (0,false,t);
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    67
(*
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    68
	fun rep_goal (Const ("all",_)$Abs (_,_,t)) = rep_goal t
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    69
	|   rep_goal (Const ("==>",_)$s$t)	   = 
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    70
			(case rep_goal t of (l,t) => (s::l,t))
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    71
	|   rep_goal t				   = ([]  ,t);
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    72
	val (prems, Const("Trueprop", _)$concl) = rep_goal 
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    73
						(#3(dest_state (st,i)));
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    74
*)
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    75
	val subgoal = #3(dest_state (st,i));
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    76
	val prems = Logic.strip_assums_hyp subgoal;
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    77
	val concl = HOLogic.dest_Trueprop (Logic.strip_assums_concl subgoal);
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    78
	fun drot_tac k i = DETERM (rotate_tac k i);
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    79
	fun spec_tac 0 i = all_tac
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    80
	|   spec_tac k i = EVERY' [dtac spec, drot_tac ~1, spec_tac (k-1)] i;
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    81
	fun dup_spec_tac k i = if k = 0 then all_tac else EVERY'
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    82
		      [DETERM o (etac all_dupE), drot_tac ~2, spec_tac (k-1)] i;
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    83
	fun same_head _ (Const (x,_)) (Const (y,_)) = x = y
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    84
	|   same_head k (s$_)         (t$_)	    = same_head k s t
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    85
	|   same_head k (Bound i)     (Bound j)	    = i = j + k
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    86
	|   same_head _ _             _             = true;
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    87
	fun mapn f n []      = []
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    88
	|   mapn f n (x::xs) = f n x::mapn f (n+1) xs;
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    89
	fun pres_tac (k,arrow,t) n i = drot_tac n i THEN (
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    90
		if same_head k t concl
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    91
		then dup_spec_tac k i THEN 
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    92
		     (if arrow then etac mp i THEN drot_tac (~n) i else atac i)
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    93
		else no_tac);
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    94
	val ptacs = mapn (fn n => fn t => 
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    95
			  pres_tac (ap (HOLogic.dest_Trueprop t)) n i) 0 prems;
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    96
	in foldl (op APPEND) (no_tac, ptacs) st end;
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    97
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    98
fun ptac prog = let
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
    99
  val proga = flat (map atomizeD prog)			(* atomize the prog *)
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
   100
  in	(REPEAT_DETERM1 o FIRST' [
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
   101
		rtac TrueI,			(* "True" *)
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
   102
		rtac conjI,			(* "[| P; Q |] ==> P & Q" *)
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
   103
		rtac allI,			(* "(!!x. P x) ==> ! x. P x" *)
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
   104
		rtac exI,			(* "P x ==> ? x. P x" *)
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
   105
		rtac impI THEN'			(* "(P ==> Q) ==> P --> Q" *)
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
   106
		  asm_full_simp_tac atomize_ss THEN'	(* atomize the asms *)
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
   107
		  (REPEAT_DETERM o (etac conjE))	(* split the asms *)
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
   108
		]) 
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
   109
	ORELSE' resolve_tac [disjI1,disjI2]	(* "P ==> P | Q","Q ==> P | Q"*)
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
   110
	ORELSE' ((resolve_tac proga APPEND' hyp_resolve_tac)
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
   111
		 THEN' (fn _ => check_HOHH_tac2))
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
   112
end;
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
   113
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
   114
fun prolog_tac prog = check_HOHH_tac1 THEN 
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
   115
		      DEPTH_SOLVE (ptac (map check_HOHH prog) 1);
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
   116
8006e9009621 added HOL/Prolog
oheimb
parents:
diff changeset
   117
val prog_HOHH = [];