src/HOL/Predicate_Compile_Examples/Code_Prolog_Examples.thy
changeset 63167 0909deb8059b
parent 58310 91ea607a34d8
child 66453 cc19f7ca2ed6
equal deleted inserted replaced
63166:143f58bb34f9 63167:0909deb8059b
     1 theory Code_Prolog_Examples
     1 theory Code_Prolog_Examples
     2 imports "~~/src/HOL/Library/Code_Prolog"
     2 imports "~~/src/HOL/Library/Code_Prolog"
     3 begin
     3 begin
     4 
     4 
     5 section {* Example append *}
     5 section \<open>Example append\<close>
     6 
     6 
     7 
     7 
     8 inductive append
     8 inductive append
     9 where
     9 where
    10   "append [] ys ys"
    10   "append [] ys ys"
    11 | "append xs ys zs ==> append (x # xs) ys (x # zs)"
    11 | "append xs ys zs ==> append (x # xs) ys (x # zs)"
    12 
    12 
    13 setup {* Code_Prolog.map_code_options (K
    13 setup \<open>Code_Prolog.map_code_options (K
    14   {ensure_groundness = false,
    14   {ensure_groundness = false,
    15    limit_globally = NONE,
    15    limit_globally = NONE,
    16    limited_types = [],
    16    limited_types = [],
    17    limited_predicates = [],
    17    limited_predicates = [],
    18    replacing = [],
    18    replacing = [],
    19    manual_reorder = []}) *}
    19    manual_reorder = []})\<close>
    20 
    20 
    21 values_prolog "{(x, y, z). append x y z}"
    21 values_prolog "{(x, y, z). append x y z}"
    22 
    22 
    23 values_prolog 4 "{(z, x, y). append x y ((1::nat) # (2 # (3 # z)))}"
    23 values_prolog 4 "{(z, x, y). append x y ((1::nat) # (2 # (3 # z)))}"
    24 
    24 
    25 values_prolog 3 "{(x, y, z). append x y z}"
    25 values_prolog 3 "{(x, y, z). append x y z}"
    26 
    26 
    27 setup {* Code_Prolog.map_code_options (K
    27 setup \<open>Code_Prolog.map_code_options (K
    28   {ensure_groundness = false,
    28   {ensure_groundness = false,
    29    limit_globally = NONE,
    29    limit_globally = NONE,
    30    limited_types = [],
    30    limited_types = [],
    31    limited_predicates = [],
    31    limited_predicates = [],
    32    replacing = [],
    32    replacing = [],
    33    manual_reorder = []}) *}
    33    manual_reorder = []})\<close>
    34 
    34 
    35 values_prolog "{(x, y, z). append x y z}"
    35 values_prolog "{(x, y, z). append x y z}"
    36 
    36 
    37 setup {* Code_Prolog.map_code_options (K
    37 setup \<open>Code_Prolog.map_code_options (K
    38   {ensure_groundness = false,
    38   {ensure_groundness = false,
    39    limit_globally = NONE,
    39    limit_globally = NONE,
    40    limited_types = [],
    40    limited_types = [],
    41    limited_predicates = [],
    41    limited_predicates = [],
    42    replacing = [],
    42    replacing = [],
    43    manual_reorder = []}) *}
    43    manual_reorder = []})\<close>
    44 
    44 
    45 
    45 
    46 section {* Example queens *}
    46 section \<open>Example queens\<close>
    47 
    47 
    48 inductive nodiag :: "int => int => int list => bool"
    48 inductive nodiag :: "int => int => int list => bool"
    49 where
    49 where
    50   "nodiag B D []"
    50   "nodiag B D []"
    51 | "D \<noteq> N - B ==> D \<noteq> B - N ==> Da = D + 1 ==> nodiag B Da L ==> nodiag B D (N # L)"
    51 | "D \<noteq> N - B ==> D \<noteq> B - N ==> Da = D + 1 ==> nodiag B Da L ==> nodiag B D (N # L)"
    52 
    52 
    53 text {*
    53 text \<open>
    54 qdelete(A, [A|L], L).
    54 qdelete(A, [A|L], L).
    55 qdelete(X, [A|Z], [A|R]) :-
    55 qdelete(X, [A|Z], [A|R]) :-
    56   qdelete(X, Z, R).
    56   qdelete(X, Z, R).
    57 *}
    57 \<close>
    58 
    58 
    59 inductive qdelete :: "int => int list => int list => bool"
    59 inductive qdelete :: "int => int list => int list => bool"
    60 where
    60 where
    61   "qdelete A (A # L) L"
    61   "qdelete A (A # L) L"
    62 | "qdelete X Z R ==> qdelete X (A # Z) (A # R)"
    62 | "qdelete X Z R ==> qdelete X (A # Z) (A # R)"
    63 
    63 
    64 text {*
    64 text \<open>
    65 qperm([], []).
    65 qperm([], []).
    66 qperm([X|Y], K) :-
    66 qperm([X|Y], K) :-
    67   qdelete(U, [X|Y], Z),
    67   qdelete(U, [X|Y], Z),
    68   K = [U|V],
    68   K = [U|V],
    69   qperm(Z, V).
    69   qperm(Z, V).
    70 *}
    70 \<close>
    71 
    71 
    72 inductive qperm :: "int list => int list => bool"
    72 inductive qperm :: "int list => int list => bool"
    73 where
    73 where
    74   "qperm [] []"
    74   "qperm [] []"
    75 | "qdelete U (X # Y) Z ==> qperm Z V ==> qperm (X # Y) (U # V)"
    75 | "qdelete U (X # Y) Z ==> qperm Z V ==> qperm (X # Y) (U # V)"
    76 
    76 
    77 text {*
    77 text \<open>
    78 safe([]).
    78 safe([]).
    79 safe([N|L]) :-
    79 safe([N|L]) :-
    80   nodiag(N, 1, L),
    80   nodiag(N, 1, L),
    81   safe(L).
    81   safe(L).
    82 *}
    82 \<close>
    83 
    83 
    84 inductive safe :: "int list => bool"
    84 inductive safe :: "int list => bool"
    85 where
    85 where
    86   "safe []"
    86   "safe []"
    87 | "nodiag N 1 L ==> safe L ==> safe (N # L)"
    87 | "nodiag N 1 L ==> safe L ==> safe (N # L)"
    88 
    88 
    89 text {*
    89 text \<open>
    90 queen(Data, Out) :-
    90 queen(Data, Out) :-
    91   qperm(Data, Out),
    91   qperm(Data, Out),
    92   safe(Out)
    92   safe(Out)
    93 *}
    93 \<close>
    94 
    94 
    95 inductive queen :: "int list => int list => bool"
    95 inductive queen :: "int list => int list => bool"
    96 where
    96 where
    97   "qperm Data Out ==> safe Out ==> queen Data Out"
    97   "qperm Data Out ==> safe Out ==> queen Data Out"
    98 
    98 
   101   "queen [1,2,3,4,5,6,7,8,9] ys ==> queen_9 ys"
   101   "queen [1,2,3,4,5,6,7,8,9] ys ==> queen_9 ys"
   102 
   102 
   103 values_prolog 10 "{ys. queen_9 ys}"
   103 values_prolog 10 "{ys. queen_9 ys}"
   104 
   104 
   105 
   105 
   106 section {* Example symbolic derivation *}
   106 section \<open>Example symbolic derivation\<close>
   107 
   107 
   108 hide_const Pow
   108 hide_const Pow
   109 
   109 
   110 datatype expr = Log expr | Mult expr expr | Div expr expr | x | Num int | Plus expr expr
   110 datatype expr = Log expr | Mult expr expr | Div expr expr | x | Num int | Plus expr expr
   111   | Minus expr expr | Uminus expr | Pow expr int | Exp expr
   111   | Minus expr expr | Uminus expr | Pow expr int | Exp expr
   112 
   112 
   113 text {*
   113 text \<open>
   114 
   114 
   115 d(U + V, X, DU + DV) :-
   115 d(U + V, X, DU + DV) :-
   116   cut,
   116   cut,
   117   d(U, X, DU),
   117   d(U, X, DU),
   118   d(V, X, DV).
   118   d(V, X, DV).
   143   d(U, X, DU).
   143   d(U, X, DU).
   144 d(x, X, num(1)) :-
   144 d(x, X, num(1)) :-
   145   cut.
   145   cut.
   146 d(num(_), _, num(0)).
   146 d(num(_), _, num(0)).
   147 
   147 
   148 *}
   148 \<close>
   149 
   149 
   150 inductive d :: "expr => expr => expr => bool"
   150 inductive d :: "expr => expr => expr => bool"
   151 where
   151 where
   152   "d U X DU ==> d V X DV ==> d (Plus U V) X (Plus DU DV)"
   152   "d U X DU ==> d V X DV ==> d (Plus U V) X (Plus DU DV)"
   153 | "d U X DU ==> d V X DV ==> d (Minus U V) X (Minus DU DV)"
   153 | "d U X DU ==> d V X DV ==> d (Minus U V) X (Minus DU DV)"
   158 | "d U X DU ==> d (Exp U) X (Mult (Exp U) DU)"
   158 | "d U X DU ==> d (Exp U) X (Mult (Exp U) DU)"
   159 | "d U X DU ==> d (Log U) X (Div DU U)"
   159 | "d U X DU ==> d (Log U) X (Div DU U)"
   160 | "d x X (Num 1)"
   160 | "d x X (Num 1)"
   161 | "d (Num n) X (Num 0)"
   161 | "d (Num n) X (Num 0)"
   162 
   162 
   163 text {*
   163 text \<open>
   164 ops8(E) :-
   164 ops8(E) :-
   165   d((x + num(1)) * ((^(x, 2) + num(2)) * (^(x, 3) + num(3))), x, E).
   165   d((x + num(1)) * ((^(x, 2) + num(2)) * (^(x, 3) + num(3))), x, E).
   166 
   166 
   167 divide10(E) :-
   167 divide10(E) :-
   168   d(((((((((x / x) / x) / x) / x) / x) / x) / x) / x) / x, x, E).
   168   d(((((((((x / x) / x) / x) / x) / x) / x) / x) / x) / x, x, E).
   170 log10(E) :-
   170 log10(E) :-
   171   d(log(log(log(log(log(log(log(log(log(log(x)))))))))), x, E).
   171   d(log(log(log(log(log(log(log(log(log(log(x)))))))))), x, E).
   172 
   172 
   173 times10(E) :-
   173 times10(E) :-
   174   d(((((((((x * x) * x) * x) * x) * x) * x) * x) * x) * x, x, E)
   174   d(((((((((x * x) * x) * x) * x) * x) * x) * x) * x) * x, x, E)
   175 *}
   175 \<close>
   176 
   176 
   177 inductive ops8 :: "expr => bool"
   177 inductive ops8 :: "expr => bool"
   178 where
   178 where
   179   "d (Mult (Plus x (Num 1)) (Mult (Plus (Pow x 2) (Num 2)) (Plus (Pow x 3) (Num 3)))) x e ==> ops8 e"
   179   "d (Mult (Plus x (Num 1)) (Mult (Plus (Pow x 2) (Num 2)) (Plus (Pow x 3) (Num 3)))) x e ==> ops8 e"
   180 
   180 
   193 values_prolog "{e. ops8 e}"
   193 values_prolog "{e. ops8 e}"
   194 values_prolog "{e. divide10 e}"
   194 values_prolog "{e. divide10 e}"
   195 values_prolog "{e. log10 e}"
   195 values_prolog "{e. log10 e}"
   196 values_prolog "{e. times10 e}"
   196 values_prolog "{e. times10 e}"
   197 
   197 
   198 section {* Example negation *}
   198 section \<open>Example negation\<close>
   199 
   199 
   200 datatype abc = A | B | C
   200 datatype abc = A | B | C
   201 
   201 
   202 inductive notB :: "abc => bool"
   202 inductive notB :: "abc => bool"
   203 where
   203 where
   204   "y \<noteq> B \<Longrightarrow> notB y"
   204   "y \<noteq> B \<Longrightarrow> notB y"
   205 
   205 
   206 setup {* Code_Prolog.map_code_options (K
   206 setup \<open>Code_Prolog.map_code_options (K
   207   {ensure_groundness = true,
   207   {ensure_groundness = true,
   208    limit_globally = NONE,
   208    limit_globally = NONE,
   209    limited_types = [],
   209    limited_types = [],
   210    limited_predicates = [],
   210    limited_predicates = [],
   211    replacing = [],
   211    replacing = [],
   212    manual_reorder = []}) *}
   212    manual_reorder = []})\<close>
   213 
   213 
   214 values_prolog 2 "{y. notB y}"
   214 values_prolog 2 "{y. notB y}"
   215 
   215 
   216 inductive notAB :: "abc * abc \<Rightarrow> bool"
   216 inductive notAB :: "abc * abc \<Rightarrow> bool"
   217 where
   217 where
   218   "y \<noteq> A \<Longrightarrow> z \<noteq> B \<Longrightarrow> notAB (y, z)"
   218   "y \<noteq> A \<Longrightarrow> z \<noteq> B \<Longrightarrow> notAB (y, z)"
   219 
   219 
   220 values_prolog 5 "{y. notAB y}"
   220 values_prolog 5 "{y. notAB y}"
   221 
   221 
   222 section {* Example prolog conform variable names *}
   222 section \<open>Example prolog conform variable names\<close>
   223 
   223 
   224 inductive equals :: "abc => abc => bool"
   224 inductive equals :: "abc => abc => bool"
   225 where
   225 where
   226   "equals y' y'"
   226   "equals y' y'"
   227 
   227