-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathswipl_stt_tree_tactics.pl
109 lines (91 loc) · 2.66 KB
/
swipl_stt_tree_tactics.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
:- module('swipl_stt_tree_tactics', [prove/3]).
:- use_module('swipl_stt_tree',[proof/3]).
:- use_module('../Tree/tree',[subst/4]).
tactic_lookup(X,XProof,[assumption(XProof,X) | _]).
tactic_lookup(X,XProof,[assumption(_,Y) | Assumptions]) :- X \= Y, tactic_lookup(X,XProof,Assumptions).
prove(Proposition,Proof,Assumptions) :-
reset_gensym,
proof(Proposition,tree(proposition,[]),Assumptions),
tactic_auto(Proposition,Proof,Assumptions),
% TODO: replace vars starting from v1
nonvar(Proof),
proof(Proof,Proposition,Assumptions).
/*
X, where X is not of the form "A -> B"
*/
tactic_auto(X,Expr,Assumptions) :-
(
tactic_lookup(X,Expr,Assumptions)
;
tactic_case(X,Expr,Assumptions)
).
/*
Maybe don't need to curry, just collect all the assumptions including the conjunction itself?
(p : A and B) -> Y
curried into (a : A) -> (b : B) -> Y
prove (y : Y) under assumptions [(a : A), (b : B)]
replace occurrences in y of 'a' and 'b' with conjunction_elim1(p) and conjunction_elim2(p), respectively
*/
tactic_case(
tree(implication,[tree(conjunction,[A,B]),Y]),
tree(implication_intro1,[binding(variable(Fresh),ExprSub)]),
Assumptions
) :-
!,
/*
% Breaks on (a ^ (b ^ c)) -> ((a ^ b) ^ c)
gensym(w,W1),
gensym(w,W2),
gensym(v,Fresh),
tactic_auto(
Y,
Expr,
[
assumption(variable(W1),A),
assumption(variable(W2),B),
assumption(variable(Fresh),tree(conjunction,[A,B]))
| Assumptions
]
),
subst(Expr,variable(W1),tree(conjunction_elim1,[variable(V)]),ExprSubA),
subst(ExprSubA,variable(W2),tree(conjunction_elim2,[variable(V)]),ExprSub).
*/
gensym(v,Fresh),
tactic_auto(
tree(implication,[A,tree(implication,[B,Y])]),
tree(implication_intro1,[binding(variable(V),tree(implication_intro1,[binding(variable(W),Expr)]))]),
[assumption(variable(Fresh),tree(conjunction,[A,B])) | Assumptions]
),
%gensym(v,Fresh),
subst(Expr,variable(V),tree(conjunction_elim1,[variable(Fresh)]),ExprSubA),
subst(ExprSubA,variable(W),tree(conjunction_elim2,[variable(Fresh)]),ExprSub).
/*
X -> Y, where X is not of the form "A and B"
*/
tactic_case(
tree(implication,[X,Y]),
tree(implication_intro1,[binding(variable(Fresh),Expr)]),
Assumptions
) :-
!,
gensym(v,Fresh),
tactic_auto(Y,Expr,[assumption(variable(Fresh),X)|Assumptions]).
tactic_case(
tree(conjunction,[X,Y]),
tree(conjunction_intro1,[XProof,YProof]),
Assumptions
) :-
tactic_auto(X,XProof,Assumptions),
tactic_auto(Y,YProof,Assumptions).
tactic_case(
tree(disjunction,[X,_]),
tree(disjunction_intro1,[XProof]),
Assumptions
) :-
tactic_auto(X,XProof,Assumptions).
tactic_case(
tree(disjunction,[_,Y]),
tree(disjunction_intro2,[YProof]),
Assumptions
) :-
tactic_auto(Y,YProof,Assumptions).