src/HOL/Predicate_Compile_Examples/Code_Prolog_Examples.thy
author wenzelm
Fri, 07 Jan 2011 23:30:29 +0100
changeset 41457 3bb2f035203f
parent 40271 6014e8252e57
child 41956 c15ef1b85035
permissions -rw-r--r--
eliminated hard tabs;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
38074
31174744b9a2 adding example file for prolog code generation; adding prolog code generation example to IsaMakefile
bulwahn
parents:
diff changeset
     1
theory Code_Prolog_Examples
38117
5ae05823cfd9 setting up Code_Prolog_Examples
bulwahn
parents: 38116
diff changeset
     2
imports Code_Prolog
38074
31174744b9a2 adding example file for prolog code generation; adding prolog code generation example to IsaMakefile
bulwahn
parents:
diff changeset
     3
begin
31174744b9a2 adding example file for prolog code generation; adding prolog code generation example to IsaMakefile
bulwahn
parents:
diff changeset
     4
31174744b9a2 adding example file for prolog code generation; adding prolog code generation example to IsaMakefile
bulwahn
parents:
diff changeset
     5
section {* Example append *}
31174744b9a2 adding example file for prolog code generation; adding prolog code generation example to IsaMakefile
bulwahn
parents:
diff changeset
     6
38792
970508a5119f added support for yet another prolog system (yap); generate has only one option ensure_groundness; added one example of yap invocation in example theory
bulwahn
parents: 38791
diff changeset
     7
38074
31174744b9a2 adding example file for prolog code generation; adding prolog code generation example to IsaMakefile
bulwahn
parents:
diff changeset
     8
inductive append
31174744b9a2 adding example file for prolog code generation; adding prolog code generation example to IsaMakefile
bulwahn
parents:
diff changeset
     9
where
31174744b9a2 adding example file for prolog code generation; adding prolog code generation example to IsaMakefile
bulwahn
parents:
diff changeset
    10
  "append [] ys ys"
31174744b9a2 adding example file for prolog code generation; adding prolog code generation example to IsaMakefile
bulwahn
parents:
diff changeset
    11
| "append xs ys zs ==> append (x # xs) ys (x # zs)"
31174744b9a2 adding example file for prolog code generation; adding prolog code generation example to IsaMakefile
bulwahn
parents:
diff changeset
    12
38963
b5d126d7be4b adapting and tuning example theories
bulwahn
parents: 38950
diff changeset
    13
setup {* Code_Prolog.map_code_options (K
b5d126d7be4b adapting and tuning example theories
bulwahn
parents: 38950
diff changeset
    14
  {ensure_groundness = false,
39800
17e29ddd538e adapting manual configuration in examples
bulwahn
parents: 39466
diff changeset
    15
   limit_globally = NONE,
38963
b5d126d7be4b adapting and tuning example theories
bulwahn
parents: 38950
diff changeset
    16
   limited_types = [],
b5d126d7be4b adapting and tuning example theories
bulwahn
parents: 38950
diff changeset
    17
   limited_predicates = [],
b5d126d7be4b adapting and tuning example theories
bulwahn
parents: 38950
diff changeset
    18
   replacing = [],
39463
7ce0ed8dc4d6 adapting examples
bulwahn
parents: 39189
diff changeset
    19
   manual_reorder = []}) *}
38792
970508a5119f added support for yet another prolog system (yap); generate has only one option ensure_groundness; added one example of yap invocation in example theory
bulwahn
parents: 38791
diff changeset
    20
970508a5119f added support for yet another prolog system (yap); generate has only one option ensure_groundness; added one example of yap invocation in example theory
bulwahn
parents: 38791
diff changeset
    21
values "{(x, y, z). append x y z}"
970508a5119f added support for yet another prolog system (yap); generate has only one option ensure_groundness; added one example of yap invocation in example theory
bulwahn
parents: 38791
diff changeset
    22
39466
f3c5da707f30 adding values to show and ensure that values works with complex terms and restores numerals on natural numbers
bulwahn
parents: 39463
diff changeset
    23
values 4 "{(z, x, y). append x y ((1::nat) # (2 # (3 # z)))}"
f3c5da707f30 adding values to show and ensure that values works with complex terms and restores numerals on natural numbers
bulwahn
parents: 39463
diff changeset
    24
38116
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
    25
values 3 "{(x, y, z). append x y z}"
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
    26
38950
62578950e748 storing options for prolog code generation in the theory
bulwahn
parents: 38949
diff changeset
    27
setup {* Code_Prolog.map_code_options (K
38949
1afa9e89c885 adapting example files to latest changes
bulwahn
parents: 38792
diff changeset
    28
  {ensure_groundness = false,
39800
17e29ddd538e adapting manual configuration in examples
bulwahn
parents: 39466
diff changeset
    29
   limit_globally = NONE,
38963
b5d126d7be4b adapting and tuning example theories
bulwahn
parents: 38950
diff changeset
    30
   limited_types = [],
b5d126d7be4b adapting and tuning example theories
bulwahn
parents: 38950
diff changeset
    31
   limited_predicates = [],
b5d126d7be4b adapting and tuning example theories
bulwahn
parents: 38950
diff changeset
    32
   replacing = [],
39463
7ce0ed8dc4d6 adapting examples
bulwahn
parents: 39189
diff changeset
    33
   manual_reorder = []}) *}
38792
970508a5119f added support for yet another prolog system (yap); generate has only one option ensure_groundness; added one example of yap invocation in example theory
bulwahn
parents: 38791
diff changeset
    34
970508a5119f added support for yet another prolog system (yap); generate has only one option ensure_groundness; added one example of yap invocation in example theory
bulwahn
parents: 38791
diff changeset
    35
values "{(x, y, z). append x y z}"
970508a5119f added support for yet another prolog system (yap); generate has only one option ensure_groundness; added one example of yap invocation in example theory
bulwahn
parents: 38791
diff changeset
    36
38950
62578950e748 storing options for prolog code generation in the theory
bulwahn
parents: 38949
diff changeset
    37
setup {* Code_Prolog.map_code_options (K
38949
1afa9e89c885 adapting example files to latest changes
bulwahn
parents: 38792
diff changeset
    38
  {ensure_groundness = false,
39800
17e29ddd538e adapting manual configuration in examples
bulwahn
parents: 39466
diff changeset
    39
   limit_globally = NONE,
38963
b5d126d7be4b adapting and tuning example theories
bulwahn
parents: 38950
diff changeset
    40
   limited_types = [],
b5d126d7be4b adapting and tuning example theories
bulwahn
parents: 38950
diff changeset
    41
   limited_predicates = [],
b5d126d7be4b adapting and tuning example theories
bulwahn
parents: 38950
diff changeset
    42
   replacing = [],
39463
7ce0ed8dc4d6 adapting examples
bulwahn
parents: 39189
diff changeset
    43
   manual_reorder = []}) *}
38792
970508a5119f added support for yet another prolog system (yap); generate has only one option ensure_groundness; added one example of yap invocation in example theory
bulwahn
parents: 38791
diff changeset
    44
38116
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
    45
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
    46
section {* Example queens *}
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
    47
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
    48
inductive nodiag :: "int => int => int list => bool"
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
    49
where
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
    50
  "nodiag B D []"
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
    51
| "D \<noteq> N - B ==> D \<noteq> B - N ==> Da = D + 1 ==> nodiag B Da L ==> nodiag B D (N # L)"
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
    52
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
    53
text {*
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
    54
qdelete(A, [A|L], L).
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
    55
qdelete(X, [A|Z], [A|R]) :-
41457
3bb2f035203f eliminated hard tabs;
wenzelm
parents: 40271
diff changeset
    56
  qdelete(X, Z, R).
38116
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
    57
*}
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
    58
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
    59
inductive qdelete :: "int => int list => int list => bool"
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
    60
where
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
    61
  "qdelete A (A # L) L"
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
    62
| "qdelete X Z R ==> qdelete X (A # Z) (A # R)"
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
    63
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
    64
text {*
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
    65
qperm([], []).
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
    66
qperm([X|Y], K) :-
41457
3bb2f035203f eliminated hard tabs;
wenzelm
parents: 40271
diff changeset
    67
  qdelete(U, [X|Y], Z),
3bb2f035203f eliminated hard tabs;
wenzelm
parents: 40271
diff changeset
    68
  K = [U|V],
3bb2f035203f eliminated hard tabs;
wenzelm
parents: 40271
diff changeset
    69
  qperm(Z, V).
38116
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
    70
*}
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
    71
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
    72
inductive qperm :: "int list => int list => bool"
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
    73
where
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
    74
  "qperm [] []"
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
    75
| "qdelete U (X # Y) Z ==> qperm Z V ==> qperm (X # Y) (U # V)"
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
    76
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
    77
text {*
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
    78
safe([]).
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
    79
safe([N|L]) :-
41457
3bb2f035203f eliminated hard tabs;
wenzelm
parents: 40271
diff changeset
    80
  nodiag(N, 1, L),
3bb2f035203f eliminated hard tabs;
wenzelm
parents: 40271
diff changeset
    81
  safe(L).
38116
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
    82
*}
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
    83
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
    84
inductive safe :: "int list => bool"
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
    85
where
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
    86
  "safe []"
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
    87
| "nodiag N 1 L ==> safe L ==> safe (N # L)"
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
    88
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
    89
text {*
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
    90
queen(Data, Out) :-
41457
3bb2f035203f eliminated hard tabs;
wenzelm
parents: 40271
diff changeset
    91
  qperm(Data, Out),
3bb2f035203f eliminated hard tabs;
wenzelm
parents: 40271
diff changeset
    92
  safe(Out)
38116
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
    93
*}
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
    94
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
    95
inductive queen :: "int list => int list => bool"
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
    96
where
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
    97
  "qperm Data Out ==> safe Out ==> queen Data Out"
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
    98
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
    99
inductive queen_9
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   100
where
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   101
  "queen [1,2,3,4,5,6,7,8,9] ys ==> queen_9 ys"
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   102
38731
2c8a595af43e invocation of values for prolog execution does not require invocation of code_pred anymore
bulwahn
parents: 38728
diff changeset
   103
values 10 "{ys. queen_9 ys}"
38116
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   104
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   105
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   106
section {* Example symbolic derivation *}
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   107
40271
6014e8252e57 hide Sum_Type.Plus
nipkow
parents: 39800
diff changeset
   108
hide_const Pow
38116
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   109
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   110
datatype expr = Log expr | Mult expr expr | Div expr expr | x | Num int | Plus expr expr
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   111
  | Minus expr expr | Uminus expr | Pow expr int | Exp expr
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   112
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   113
text {*
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   114
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   115
d(U + V, X, DU + DV) :-
41457
3bb2f035203f eliminated hard tabs;
wenzelm
parents: 40271
diff changeset
   116
  cut,
3bb2f035203f eliminated hard tabs;
wenzelm
parents: 40271
diff changeset
   117
  d(U, X, DU),
3bb2f035203f eliminated hard tabs;
wenzelm
parents: 40271
diff changeset
   118
  d(V, X, DV).
38116
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   119
d(U - V, X, DU - DV) :-
41457
3bb2f035203f eliminated hard tabs;
wenzelm
parents: 40271
diff changeset
   120
  cut,
3bb2f035203f eliminated hard tabs;
wenzelm
parents: 40271
diff changeset
   121
  d(U, X, DU),
3bb2f035203f eliminated hard tabs;
wenzelm
parents: 40271
diff changeset
   122
  d(V, X, DV).
38116
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   123
d(U * V, X, DU * V + U * DV) :-
41457
3bb2f035203f eliminated hard tabs;
wenzelm
parents: 40271
diff changeset
   124
  cut,
3bb2f035203f eliminated hard tabs;
wenzelm
parents: 40271
diff changeset
   125
  d(U, X, DU),
3bb2f035203f eliminated hard tabs;
wenzelm
parents: 40271
diff changeset
   126
  d(V, X, DV).
38116
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   127
d(U / V, X, (DU * V - U * DV) / ^(V, 2)) :-
41457
3bb2f035203f eliminated hard tabs;
wenzelm
parents: 40271
diff changeset
   128
  cut,
3bb2f035203f eliminated hard tabs;
wenzelm
parents: 40271
diff changeset
   129
  d(U, X, DU),
3bb2f035203f eliminated hard tabs;
wenzelm
parents: 40271
diff changeset
   130
  d(V, X, DV).
38116
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   131
d(^(U, N), X, DU * num(N) * ^(U, N1)) :-
41457
3bb2f035203f eliminated hard tabs;
wenzelm
parents: 40271
diff changeset
   132
  cut,
3bb2f035203f eliminated hard tabs;
wenzelm
parents: 40271
diff changeset
   133
  N1 is N - 1,
3bb2f035203f eliminated hard tabs;
wenzelm
parents: 40271
diff changeset
   134
  d(U, X, DU).
38116
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   135
d(-U, X, -DU) :-
41457
3bb2f035203f eliminated hard tabs;
wenzelm
parents: 40271
diff changeset
   136
  cut,
3bb2f035203f eliminated hard tabs;
wenzelm
parents: 40271
diff changeset
   137
  d(U, X, DU).
38116
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   138
d(exp(U), X, exp(U) * DU) :-
41457
3bb2f035203f eliminated hard tabs;
wenzelm
parents: 40271
diff changeset
   139
  cut,
3bb2f035203f eliminated hard tabs;
wenzelm
parents: 40271
diff changeset
   140
  d(U, X, DU).
38116
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   141
d(log(U), X, DU / U) :-
41457
3bb2f035203f eliminated hard tabs;
wenzelm
parents: 40271
diff changeset
   142
  cut,
3bb2f035203f eliminated hard tabs;
wenzelm
parents: 40271
diff changeset
   143
  d(U, X, DU).
38116
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   144
d(x, X, num(1)) :-
41457
3bb2f035203f eliminated hard tabs;
wenzelm
parents: 40271
diff changeset
   145
  cut.
38116
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   146
d(num(_), _, num(0)).
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   147
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   148
*}
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   149
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   150
inductive d :: "expr => expr => expr => bool"
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   151
where
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   152
  "d U X DU ==> d V X DV ==> d (Plus U V) X (Plus DU DV)"
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   153
| "d U X DU ==> d V X DV ==> d (Minus U V) X (Minus DU DV)"
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   154
| "d U X DU ==> d V X DV ==> d (Mult U V) X (Plus (Mult DU V) (Mult U DV))"
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   155
| "d U X DU ==> d V X DV ==> d (Div U V) X (Div (Minus (Mult DU V) (Mult U DV)) (Pow V 2))"
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   156
| "d U X DU ==> N1 = N - 1 ==> d (Pow U N) X (Mult DU (Mult (Num N) (Pow U N1)))"
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   157
| "d U X DU ==> d (Uminus U) X (Uminus DU)"
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   158
| "d U X DU ==> d (Exp U) X (Mult (Exp U) DU)"
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   159
| "d U X DU ==> d (Log U) X (Div DU U)"
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   160
| "d x X (Num 1)"
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   161
| "d (Num n) X (Num 0)"
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   162
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   163
text {*
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   164
ops8(E) :-
41457
3bb2f035203f eliminated hard tabs;
wenzelm
parents: 40271
diff changeset
   165
  d((x + num(1)) * ((^(x, 2) + num(2)) * (^(x, 3) + num(3))), x, E).
38116
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   166
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   167
divide10(E) :-
41457
3bb2f035203f eliminated hard tabs;
wenzelm
parents: 40271
diff changeset
   168
  d(((((((((x / x) / x) / x) / x) / x) / x) / x) / x) / x, x, E).
38116
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   169
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   170
log10(E) :-
41457
3bb2f035203f eliminated hard tabs;
wenzelm
parents: 40271
diff changeset
   171
  d(log(log(log(log(log(log(log(log(log(log(x)))))))))), x, E).
38116
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   172
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   173
times10(E) :-
41457
3bb2f035203f eliminated hard tabs;
wenzelm
parents: 40271
diff changeset
   174
  d(((((((((x * x) * x) * x) * x) * x) * x) * x) * x) * x, x, E)
38116
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   175
*}
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   176
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   177
inductive ops8 :: "expr => bool"
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   178
where
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   179
  "d (Mult (Plus x (Num 1)) (Mult (Plus (Pow x 2) (Num 2)) (Plus (Pow x 3) (Num 3)))) x e ==> ops8 e"
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   180
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   181
inductive divide10
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   182
where
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   183
  "d (Div (Div (Div (Div (Div (Div (Div (Div (Div x x) x) x) x) x) x) x) x) x) x e ==> divide10 e"
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   184
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   185
inductive log10
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   186
where
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   187
 "d (Log (Log (Log (Log (Log (Log (Log (Log (Log (Log x)))))))))) x e ==> log10 e"
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   188
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   189
inductive times10
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   190
where
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   191
  "d (Mult (Mult (Mult (Mult (Mult (Mult (Mult (Mult (Mult x x) x) x) x) x) x) x) x) x) x e ==> times10 e"
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   192
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   193
values "{e. ops8 e}"
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   194
values "{e. divide10 e}"
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   195
values "{e. log10 e}"
823b1e8bc090 adding queens and symbolic derivation example for prolog code generation
bulwahn
parents: 38080
diff changeset
   196
values "{e. times10 e}"
38075
3d5e2b7d1374 adding values command and parsing prolog output
bulwahn
parents: 38074
diff changeset
   197
38727
c7f5f0b7dc7f adding very basic transformation to ensure groundness before negations
bulwahn
parents: 38117
diff changeset
   198
section {* Example negation *}
c7f5f0b7dc7f adding very basic transformation to ensure groundness before negations
bulwahn
parents: 38117
diff changeset
   199
c7f5f0b7dc7f adding very basic transformation to ensure groundness before negations
bulwahn
parents: 38117
diff changeset
   200
datatype abc = A | B | C
c7f5f0b7dc7f adding very basic transformation to ensure groundness before negations
bulwahn
parents: 38117
diff changeset
   201
c7f5f0b7dc7f adding very basic transformation to ensure groundness before negations
bulwahn
parents: 38117
diff changeset
   202
inductive notB :: "abc => bool"
c7f5f0b7dc7f adding very basic transformation to ensure groundness before negations
bulwahn
parents: 38117
diff changeset
   203
where
c7f5f0b7dc7f adding very basic transformation to ensure groundness before negations
bulwahn
parents: 38117
diff changeset
   204
  "y \<noteq> B \<Longrightarrow> notB y"
c7f5f0b7dc7f adding very basic transformation to ensure groundness before negations
bulwahn
parents: 38117
diff changeset
   205
38963
b5d126d7be4b adapting and tuning example theories
bulwahn
parents: 38950
diff changeset
   206
setup {* Code_Prolog.map_code_options (K
b5d126d7be4b adapting and tuning example theories
bulwahn
parents: 38950
diff changeset
   207
  {ensure_groundness = true,
39800
17e29ddd538e adapting manual configuration in examples
bulwahn
parents: 39466
diff changeset
   208
   limit_globally = NONE,
38963
b5d126d7be4b adapting and tuning example theories
bulwahn
parents: 38950
diff changeset
   209
   limited_types = [],
b5d126d7be4b adapting and tuning example theories
bulwahn
parents: 38950
diff changeset
   210
   limited_predicates = [],
b5d126d7be4b adapting and tuning example theories
bulwahn
parents: 38950
diff changeset
   211
   replacing = [],
39463
7ce0ed8dc4d6 adapting examples
bulwahn
parents: 39189
diff changeset
   212
   manual_reorder = []}) *}
38727
c7f5f0b7dc7f adding very basic transformation to ensure groundness before negations
bulwahn
parents: 38117
diff changeset
   213
c7f5f0b7dc7f adding very basic transformation to ensure groundness before negations
bulwahn
parents: 38117
diff changeset
   214
values 2 "{y. notB y}"
c7f5f0b7dc7f adding very basic transformation to ensure groundness before negations
bulwahn
parents: 38117
diff changeset
   215
38728
182b180e9804 improving ensure_groundness in prolog generation; added further example
bulwahn
parents: 38727
diff changeset
   216
inductive notAB :: "abc * abc \<Rightarrow> bool"
182b180e9804 improving ensure_groundness in prolog generation; added further example
bulwahn
parents: 38727
diff changeset
   217
where
182b180e9804 improving ensure_groundness in prolog generation; added further example
bulwahn
parents: 38727
diff changeset
   218
  "y \<noteq> A \<Longrightarrow> z \<noteq> B \<Longrightarrow> notAB (y, z)"
182b180e9804 improving ensure_groundness in prolog generation; added further example
bulwahn
parents: 38727
diff changeset
   219
182b180e9804 improving ensure_groundness in prolog generation; added further example
bulwahn
parents: 38727
diff changeset
   220
values 5 "{y. notAB y}"
182b180e9804 improving ensure_groundness in prolog generation; added further example
bulwahn
parents: 38727
diff changeset
   221
38735
cb9031a9dccf renaming variables to conform to prolog names
bulwahn
parents: 38731
diff changeset
   222
section {* Example prolog conform variable names *}
cb9031a9dccf renaming variables to conform to prolog names
bulwahn
parents: 38731
diff changeset
   223
cb9031a9dccf renaming variables to conform to prolog names
bulwahn
parents: 38731
diff changeset
   224
inductive equals :: "abc => abc => bool"
cb9031a9dccf renaming variables to conform to prolog names
bulwahn
parents: 38731
diff changeset
   225
where
cb9031a9dccf renaming variables to conform to prolog names
bulwahn
parents: 38731
diff changeset
   226
  "equals y' y'"
38791
4a4be1be0fae adapted examples; tuned
bulwahn
parents: 38735
diff changeset
   227
38735
cb9031a9dccf renaming variables to conform to prolog names
bulwahn
parents: 38731
diff changeset
   228
values 1 "{(y, z). equals y z}"
cb9031a9dccf renaming variables to conform to prolog names
bulwahn
parents: 38731
diff changeset
   229
38074
31174744b9a2 adding example file for prolog code generation; adding prolog code generation example to IsaMakefile
bulwahn
parents:
diff changeset
   230
end