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). |
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 |