-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathswipl_stt_tree.pl
87 lines (55 loc) · 2.55 KB
/
swipl_stt_tree.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
:- module(swipl_stt_tree,[proof/3]).
/*
*
* Introducing variable binding. This sucks! Get rid of the "tree" thing but
* keep the variable binding.
*
*/
% hypothesis
proof(variable(V), X,[assumption(variable(V),X)|_]).
proof(variable(V), X,[assumption(variable(W),_)|Assumptions]) :- V \= W, proof(variable(V),X,Assumptions).
% reification of `false`
proof(tree(empty,[]),tree(proposition,[]),_).
% reification of `true`
proof(tree(top,[]),tree(proposition,[]),_).
proof(tree(top_intro1,[]), tree(top,[]),_).
% bool
proof(tree(bool,[]),tree(proposition,[]),_).
proof(tree(bool_intro1,[]), tree(bool,[]),_).
proof(tree(bool_intro2,[]), tree(bool,[]),_).
% reification of `,`
proof(tree(conjunction,[X,Y]),tree(proposition,[]),Assumptions) :-
proof(X, tree(proposition,[]), Assumptions),
proof(Y, tree(proposition,[]), Assumptions).
proof(tree(conjunction_intro1,[XProof,YProof]),tree(conjunction,[X,Y]),Assumptions) :-
proof(tree(conjunction,[X,Y]),tree(proposition,[]),Assumptions),
proof(XProof,X,Assumptions),
proof(YProof,Y,Assumptions).
proof(tree(conjunction_elim1,[P]),X,Assumptions) :-
proof(P,tree(conjunction, [X,_]),Assumptions).
proof(tree(conjunction_elim2,[P]),Y,Assumptions) :-
proof(P,tree(conjunction, [_,Y]),Assumptions).
% reification of `;`
proof(tree(disjunction,[X,Y]),tree(proposition,[]),Assumptions) :-
proof(X, tree(proposition,[]), Assumptions),
proof(Y, tree(proposition,[]), Assumptions).
proof(tree(disjunction_intro1,[XProof]),tree(disjunction,[X,Y]),Assumptions) :-
proof(tree(disjunction,[X,Y]),tree(proposition,[]),Assumptions),
proof(XProof,X,Assumptions).
proof(tree(disjunction_intro2,[YProof]),tree(disjunction,[X,Y]),Assumptions) :-
proof(tree(disjunction,[X,Y]),tree(proposition,[]),Assumptions),
proof(YProof,Y,Assumptions).
proof(tree(disjunction_elim1, [P,binding(variable(V),Left),binding(variable(W),Right)]),C,Assumptions) :-
proof(P,tree(disjunction,[X,Y]),Assumptions),
proof(Left,C,[assumption(variable(V),X)|Assumptions]),
proof(Right,C,[assumption(variable(W),Y)|Assumptions]).
% reification of `:-`
proof(tree(implication,[X,Y]),tree(proposition,[]),Assumptions) :-
proof(X, tree(proposition,[]), Assumptions),
proof(Y, tree(proposition,[]), Assumptions).
proof(tree(implication_intro1,[binding(variable(V),Expr)]),tree(implication,[X,Y]), Assumptions) :-
proof(tree(implication,[X,Y]),tree(proposition,[]),Assumptions),
proof(Expr,Y,[assumption(variable(V),X)|Assumptions]).
proof(tree(implication_elim1,[F,X]),B,Assumptions) :-
proof(X,A,Assumptions),
proof(F,tree(implication,[A,B]),Assumptions).