src/HOL/Prolog/Test.thy
changeset 67613 ce654b0e6d69
parent 67399 eab6ce8368fa
child 69597 ff784d5a5bfb
equal deleted inserted replaced
67610:4939494ed791 67613:ce654b0e6d69
    50   remove  :: "['a, 'b, 'b]                           => bool" and
    50   remove  :: "['a, 'b, 'b]                           => bool" and
    51   bag_appl:: "['a, 'a, 'a, 'a]                       => bool"
    51   bag_appl:: "['a, 'a, 'a, 'a]                       => bool"
    52 where
    52 where
    53         append:  "\<And>x xs ys zs. append  []    xs  xs    ..
    53         append:  "\<And>x xs ys zs. append  []    xs  xs    ..
    54                   append (x#xs) ys (x#zs) :- append xs ys zs" and
    54                   append (x#xs) ys (x#zs) :- append xs ys zs" and
    55         reverse: "\<And>L1 L2. reverse L1 L2 :- (!rev_aux.
    55         reverse: "\<And>L1 L2. reverse L1 L2 :- (\<forall>rev_aux.
    56                   (!L.          rev_aux  []    L  L )..
    56                   (\<forall>L.          rev_aux  []    L  L )..
    57                   (!X L1 L2 L3. rev_aux (X#L1) L2 L3 :- rev_aux L1 L2 (X#L3))
    57                   (\<forall>X L1 L2 L3. rev_aux (X#L1) L2 L3 :- rev_aux L1 L2 (X#L3))
    58                   => rev_aux L1 L2 [])" and
    58                   => rev_aux L1 L2 [])" and
    59 
    59 
    60         mappred: "\<And>x xs y ys P. mappred P  []     []    ..
    60         mappred: "\<And>x xs y ys P. mappred P  []     []    ..
    61                   mappred P (x#xs) (y#ys) :- P x y  &  mappred P xs ys" and
    61                   mappred P (x#xs) (y#ys) :- P x y  &  mappred P xs ys" and
    62         mapfun:  "\<And>x xs ys f. mapfun f  []     []      ..
    62         mapfun:  "\<And>x xs ys f. mapfun f  []     []      ..
    68 
    68 
    69         eq:      "\<And>x. eq x x" and
    69         eq:      "\<And>x. eq x x" and
    70 
    70 
    71 (* actual definitions of empty and add is hidden -> yields abstract data type *)
    71 (* actual definitions of empty and add is hidden -> yields abstract data type *)
    72 
    72 
    73         bag_appl: "\<And>A B X Y. bag_appl A B X Y:- (? S1 S2 S3 S4 S5.
    73         bag_appl: "\<And>A B X Y. bag_appl A B X Y:- (\<exists>S1 S2 S3 S4 S5.
    74                                 empty    S1    &
    74                                 empty    S1    &
    75                                 add A    S1 S2 &
    75                                 add A    S1 S2 &
    76                                 add B    S2 S3 &
    76                                 add B    S2 S3 &
    77                                 remove X S3 S4 &
    77                                 remove X S3 S4 &
    78                                 remove Y S4 S5 &
    78                                 remove Y S4 S5 &
    90 
    90 
    91 schematic_goal "append [a,b] y ?L"
    91 schematic_goal "append [a,b] y ?L"
    92   apply (prolog prog_Test)
    92   apply (prolog prog_Test)
    93   done
    93   done
    94 
    94 
    95 schematic_goal "!y. append [a,b] y (?L y)"
    95 schematic_goal "\<forall>y. append [a,b] y (?L y)"
    96   apply (prolog prog_Test)
    96   apply (prolog prog_Test)
    97   done
    97   done
    98 
    98 
    99 schematic_goal "reverse [] ?L"
    99 schematic_goal "reverse [] ?L"
   100   apply (prolog prog_Test)
   100   apply (prolog prog_Test)
   115 schematic_goal "mappred age ?x [23,24]"
   115 schematic_goal "mappred age ?x [23,24]"
   116   apply (prolog prog_Test)
   116   apply (prolog prog_Test)
   117   back
   117   back
   118   done
   118   done
   119 
   119 
   120 schematic_goal "mappred (%x y. ? z. age z y) ?x [23,24]"
   120 schematic_goal "mappred (\<lambda>x y. \<exists>z. age z y) ?x [23,24]"
   121   apply (prolog prog_Test)
   121   apply (prolog prog_Test)
   122   done
   122   done
   123 
   123 
   124 schematic_goal "mappred ?P [bob,sue] [24,23]"
   124 schematic_goal "mappred ?P [bob,sue] [24,23]"
   125   apply (prolog prog_Test)
   125   apply (prolog prog_Test)
   157   apply (prolog prog_Test)
   157   apply (prolog prog_Test)
   158   back
   158   back
   159   back
   159   back
   160   done
   160   done
   161 
   161 
   162 lemma "? x y. age x y"
   162 lemma "\<exists>x y. age x y"
   163   apply (prolog prog_Test)
   163   apply (prolog prog_Test)
   164   done
   164   done
   165 
   165 
   166 lemma "!x y. append [] x x"
   166 lemma "\<forall>x y. append [] x x"
   167   apply (prolog prog_Test)
   167   apply (prolog prog_Test)
   168   done
   168   done
   169 
   169 
   170 schematic_goal "age sue 24 .. age bob 23 => age ?x ?y"
   170 schematic_goal "age sue 24 .. age bob 23 => age ?x ?y"
   171   apply (prolog prog_Test)
   171   apply (prolog prog_Test)
   179 lemma "age bob 25 :- age bob 24 => age bob 25"
   179 lemma "age bob 25 :- age bob 24 => age bob 25"
   180   apply (prolog prog_Test)
   180   apply (prolog prog_Test)
   181   done
   181   done
   182 (*reset trace_DEPTH_FIRST;*)
   182 (*reset trace_DEPTH_FIRST;*)
   183 
   183 
   184 schematic_goal "(!x. age x 25 :- age x 23) => age ?x 25 & age ?y 25"
   184 schematic_goal "(\<forall>x. age x 25 :- age x 23) => age ?x 25 & age ?y 25"
   185   apply (prolog prog_Test)
   185   apply (prolog prog_Test)
   186   back
   186   back
   187   back
   187   back
   188   back
   188   back
   189   done
   189   done
   190 
   190 
   191 lemma "!x. ? y. eq x y"
   191 lemma "\<forall>x. \<exists>y. eq x y"
   192   apply (prolog prog_Test)
   192   apply (prolog prog_Test)
   193   done
   193   done
   194 
   194 
   195 schematic_goal "? P. P & eq P ?x"
   195 schematic_goal "\<exists>P. P \<and> eq P ?x"
   196   apply (prolog prog_Test)
   196   apply (prolog prog_Test)
   197 (*
   197 (*
   198   back
   198   back
   199   back
   199   back
   200   back
   200   back
   204   back
   204   back
   205   back
   205   back
   206 *)
   206 *)
   207   done
   207   done
   208 
   208 
   209 lemma "? P. eq P (True & True) & P"
   209 lemma "\<exists>P. eq P (True & True) \<and> P"
   210   apply (prolog prog_Test)
   210   apply (prolog prog_Test)
   211   done
   211   done
   212 
   212 
   213 lemma "? P. eq P (|) & P k True"
   213 lemma "\<exists>P. eq P (\<or>) \<and> P k True"
   214   apply (prolog prog_Test)
   214   apply (prolog prog_Test)
   215   done
   215   done
   216 
   216 
   217 lemma "? P. eq P (Q => True) & P"
   217 lemma "\<exists>P. eq P (Q => True) \<and> P"
   218   apply (prolog prog_Test)
   218   apply (prolog prog_Test)
   219   done
   219   done
   220 
   220 
   221 (* P flexible: *)
   221 (* P flexible: *)
   222 lemma "(!P k l. P k l :- eq P Q) => Q a b"
   222 lemma "(\<forall>P k l. P k l :- eq P Q) => Q a b"
   223   apply (prolog prog_Test)
   223   apply (prolog prog_Test)
   224   done
   224   done
   225 (*
   225 (*
   226 loops:
   226 loops:
   227 lemma "(!P k l. P k l :- eq P (%x y. x | y)) => a | b"
   227 lemma "(!P k l. P k l :- eq P (%x y. x | y)) => a | b"
   228 *)
   228 *)
   229 
   229 
   230 (* implication and disjunction in atom: *)
   230 (* implication and disjunction in atom: *)
   231 lemma "? Q. (!p q. R(q :- p) => R(Q p q)) & Q (t | s) (s | t)"
   231 lemma "\<exists>Q. (\<forall>p q. R(q :- p) => R(Q p q)) \<and> Q (t | s) (s | t)"
   232   by fast
   232   by fast
   233 
   233 
   234 (* disjunction in atom: *)
   234 (* disjunction in atom: *)
   235 lemma "(!P. g P :- (P => b | a)) => g(a | b)"
   235 lemma "(\<forall>P. g P :- (P => b \<or> a)) => g(a \<or> b)"
   236   apply (tactic "step_tac (put_claset HOL_cs @{context}) 1")
   236   apply (tactic "step_tac (put_claset HOL_cs @{context}) 1")
   237   apply (tactic "step_tac (put_claset HOL_cs @{context}) 1")
   237   apply (tactic "step_tac (put_claset HOL_cs @{context}) 1")
   238   apply (tactic "step_tac (put_claset HOL_cs @{context}) 1")
   238   apply (tactic "step_tac (put_claset HOL_cs @{context}) 1")
   239    prefer 2
   239    prefer 2
   240    apply fast
   240    apply fast
   245 hangs:
   245 hangs:
   246 lemma "(!P. g P :- (P => b | a)) => g(a | b)"
   246 lemma "(!P. g P :- (P => b | a)) => g(a | b)"
   247   by fast
   247   by fast
   248 *)
   248 *)
   249 
   249 
   250 schematic_goal "!Emp Stk.(
   250 schematic_goal "\<forall>Emp Stk.(
   251                        empty    (Emp::'b) .. 
   251                        empty    (Emp::'b) .. 
   252          (!(X::nat) S. add    X (S::'b)         (Stk X S)) .. 
   252          (\<forall>(X::nat) S. add    X (S::'b)         (Stk X S)) .. 
   253          (!(X::nat) S. remove X ((Stk X S)::'b) S))
   253          (\<forall>(X::nat) S. remove X ((Stk X S)::'b) S))
   254  => bag_appl 23 24 ?X ?Y"
   254  => bag_appl 23 24 ?X ?Y"
   255   oops
   255   oops
   256 
   256 
   257 schematic_goal "!Qu. ( 
   257 schematic_goal "\<forall>Qu. ( 
   258           (!L.            empty    (Qu L L)) .. 
   258           (\<forall>L.            empty    (Qu L L)) .. 
   259           (!(X::nat) L K. add    X (Qu L (X#K)) (Qu L K)) ..
   259           (\<forall>(X::nat) L K. add    X (Qu L (X#K)) (Qu L K)) ..
   260           (!(X::nat) L K. remove X (Qu (X#L) K) (Qu L K)))
   260           (\<forall>(X::nat) L K. remove X (Qu (X#L) K) (Qu L K)))
   261  => bag_appl 23 24 ?X ?Y"
   261  => bag_appl 23 24 ?X ?Y"
   262   oops
   262   oops
   263 
   263 
   264 lemma "D & (!y. E) :- (!x. True & True) :- True => D"
   264 lemma "D \<and> (\<forall>y. E) :- (\<forall>x. True \<and> True) :- True => D"
   265   apply (prolog prog_Test)
   265   apply (prolog prog_Test)
   266   done
   266   done
   267 
   267 
   268 schematic_goal "P x .. P y => P ?X"
   268 schematic_goal "P x .. P y => P ?X"
   269   apply (prolog prog_Test)
   269   apply (prolog prog_Test)