author | wenzelm |
Tue, 05 Jan 2016 15:53:17 +0100 | |
changeset 62064 | d9874039786e |
parent 62020 | 5d208fd2507d |
child 69587 | 53982d5ec0bb |
permissions | -rw-r--r-- |
31974 | 1 |
(* Title: FOL/ex/Prolog.thy |
1473 | 2 |
Author: Lawrence C Paulson, Cambridge University Computer Laboratory |
0 | 3 |
Copyright 1992 University of Cambridge |
4 |
*) |
|
5 |
||
60770 | 6 |
section \<open>First-Order Logic: PROLOG examples\<close> |
17245 | 7 |
|
8 |
theory Prolog |
|
9 |
imports FOL |
|
10 |
begin |
|
11 |
||
12 |
typedecl 'a list |
|
55380
4de48353034e
prefer vacuous definitional type classes over axiomatic ones;
wenzelm
parents:
41779
diff
changeset
|
13 |
instance list :: ("term") "term" .. |
41779 | 14 |
|
15 |
axiomatization |
|
16 |
Nil :: "'a list" and |
|
17 |
Cons :: "['a, 'a list]=> 'a list" (infixr ":" 60) and |
|
18 |
app :: "['a list, 'a list, 'a list] => o" and |
|
17245 | 19 |
rev :: "['a list, 'a list] => o" |
41779 | 20 |
where |
21 |
appNil: "app(Nil,ys,ys)" and |
|
22 |
appCons: "app(xs,ys,zs) ==> app(x:xs, ys, x:zs)" and |
|
23 |
revNil: "rev(Nil,Nil)" and |
|
17245 | 24 |
revCons: "[| rev(xs,ys); app(ys, x:Nil, zs) |] ==> rev(x:xs, zs)" |
25 |
||
61337 | 26 |
schematic_goal "app(a:b:c:Nil, d:e:Nil, ?x)" |
19819 | 27 |
apply (rule appNil appCons) |
28 |
apply (rule appNil appCons) |
|
29 |
apply (rule appNil appCons) |
|
30 |
apply (rule appNil appCons) |
|
31 |
done |
|
32 |
||
61337 | 33 |
schematic_goal "app(?x, c:d:Nil, a:b:c:d:Nil)" |
19819 | 34 |
apply (rule appNil appCons)+ |
35 |
done |
|
36 |
||
61337 | 37 |
schematic_goal "app(?x, ?y, a:b:c:d:Nil)" |
19819 | 38 |
apply (rule appNil appCons)+ |
39 |
back |
|
40 |
back |
|
41 |
back |
|
42 |
back |
|
43 |
done |
|
44 |
||
45 |
(*app([x1,...,xn], y, ?z) requires (n+1) inferences*) |
|
46 |
(*rev([x1,...,xn], ?y) requires (n+1)(n+2)/2 inferences*) |
|
47 |
||
48 |
lemmas rules = appNil appCons revNil revCons |
|
49 |
||
61337 | 50 |
schematic_goal "rev(a:b:c:d:Nil, ?x)" |
19819 | 51 |
apply (rule rules)+ |
52 |
done |
|
53 |
||
61337 | 54 |
schematic_goal "rev(a:b:c:d:e:f:g:h:i:j:k:l:m:n:Nil, ?w)" |
19819 | 55 |
apply (rule rules)+ |
56 |
done |
|
57 |
||
61337 | 58 |
schematic_goal "rev(?x, a:b:c:Nil)" |
62020 | 59 |
apply (rule rules)+ \<comment> \<open>does not solve it directly!\<close> |
19819 | 60 |
back |
61 |
back |
|
62 |
done |
|
63 |
||
64 |
(*backtracking version*) |
|
60770 | 65 |
ML \<open> |
59498
50b60f501b05
proper context for resolve_tac, eresolve_tac, dresolve_tac, forward_tac etc.;
wenzelm
parents:
58889
diff
changeset
|
66 |
fun prolog_tac ctxt = |
50b60f501b05
proper context for resolve_tac, eresolve_tac, dresolve_tac, forward_tac etc.;
wenzelm
parents:
58889
diff
changeset
|
67 |
DEPTH_FIRST (has_fewer_prems 1) (resolve_tac ctxt @{thms rules} 1) |
60770 | 68 |
\<close> |
19819 | 69 |
|
61337 | 70 |
schematic_goal "rev(?x, a:b:c:Nil)" |
59498
50b60f501b05
proper context for resolve_tac, eresolve_tac, dresolve_tac, forward_tac etc.;
wenzelm
parents:
58889
diff
changeset
|
71 |
apply (tactic \<open>prolog_tac @{context}\<close>) |
19819 | 72 |
done |
73 |
||
61337 | 74 |
schematic_goal "rev(a:?x:c:?y:Nil, d:?z:b:?u)" |
59498
50b60f501b05
proper context for resolve_tac, eresolve_tac, dresolve_tac, forward_tac etc.;
wenzelm
parents:
58889
diff
changeset
|
75 |
apply (tactic \<open>prolog_tac @{context}\<close>) |
19819 | 76 |
done |
77 |
||
78 |
(*rev([a..p], ?w) requires 153 inferences *) |
|
61337 | 79 |
schematic_goal "rev(a:b:c:d:e:f:g:h:i:j:k:l:m:n:o:p:Nil, ?w)" |
60770 | 80 |
apply (tactic \<open> |
81 |
DEPTH_SOLVE (resolve_tac @{context} ([@{thm refl}, @{thm conjI}] @ @{thms rules}) 1)\<close>) |
|
19819 | 82 |
done |
83 |
||
84 |
(*?x has 16, ?y has 32; rev(?y,?w) requires 561 (rather large) inferences |
|
85 |
total inferences = 2 + 1 + 17 + 561 = 581*) |
|
61489 | 86 |
schematic_goal "a:b:c:d:e:f:g:h:i:j:k:l:m:n:o:p:Nil = ?x \<and> app(?x,?x,?y) \<and> rev(?y,?w)" |
60770 | 87 |
apply (tactic \<open> |
88 |
DEPTH_SOLVE (resolve_tac @{context} ([@{thm refl}, @{thm conjI}] @ @{thms rules}) 1)\<close>) |
|
19819 | 89 |
done |
17245 | 90 |
|
0 | 91 |
end |