-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathswipl_stt.pl
107 lines (80 loc) · 2.72 KB
/
swipl_stt.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
:- module(swipl_stt,[proof/3]).
/*
*
* This fixes the termination issue we had in proof-checking IPL, though that's
* somewhat independent of the motivation for development of IPL into STT.
*
* Termination can be demonstrated by noting that in proof-checking, the rules
* only do substructural recursion.
*
* How about termination of proof-search? This should be logically equivalent
* to IPL so we should hypothetically be able to have complete proof search.
*/
% hypothesis rule
proof(x(V), X,[(x(V),X)|_]).
proof(x(V), X,[(x(W),_)|Assumptions]) :- V \= W, proof(x(V),X,Assumptions).
% reification of `false`
proof(empty,proposition,_).
% reification of `true`
proof(unit,proposition,_).
proof(unit_intro1,unit,_).
/*
proof(top_elim(T,CProof), C, Assumptions) :-
proof(T,top),
proof(CProof,C,[(x(V),top)|Assumptions]).
*/
% bool
proof(bool,proposition,_).
proof(bool_intro1,bool,_).
proof(bool_intro2,bool,_).
/*
proof(bool_elim(B, CProof1, CProof2), C, Assumptions) :-
proof(B,bool,Assumptions),
proof(CProof1,C,[(x(V),bool)|Assumptions]),
proof(Cproof2,C,[(x(W),bool)|Assumptions]).
*/
% reification of `,`
proof(and(X,Y),proposition,Assumptions) :-
proof(X,proposition,Assumptions),
proof(Y,proposition,Assumptions).
proof(and_intro1(XProof,YProof),and(X,Y),Assumptions) :-
proof(and(X,Y),proposition,Assumptions),
proof(XProof,X,Assumptions),
proof(YProof,Y,Assumptions).
% negative formulation of and_elim rules
proof(and_elim1(P),X,Assumptions) :-
proof(P,and(X,_),Assumptions).
proof(and_elim2(P),Y,Assumptions) :-
proof(P,and(_,Y),Assumptions).
/*
% positive formulation of and_elim
proof(and_elim3(P, CProof),C,Assumptions) :-
proof(P, and(X,Y), Assumptions),
proof(CProof, C, [assumption(XProof,X), assumption(YProof,Y) | C]).
*/
% reification of `;`
proof(or(X,Y),proposition,Assumptions) :-
proof(X,proposition,Assumptions),
proof(Y, proposition, Assumptions).
proof(or_intro1(XProof),or(X,Y),Assumptions) :-
proof(or(X,Y),proposition,Assumptions),
proof(XProof,X,Assumptions).
proof(or_intro2(YProof),or(X,Y),Assumptions) :-
proof(or(X,Y),proposition,Assumptions),
proof(YProof,Y,Assumptions).
/*
proof(or_elim1(P,variable(V),Left,Right),C,Assumptions) :-
proof(P,disjunction(X,Y),Assumptions),
proof(Left,C,[assumption(variable(V),X)|Assumptions]),
proof(Right,C,[assumption(variable(V),Y)|Assumptions]).
*/
% reification of `:-`
proof(implies(X,Y),proposition,Assumptions) :-
proof(X,proposition,Assumptions),
proof(Y,proposition,Assumptions).
proof(implies_intro(variable(V),Expr),implies(X,Y), Assumptions) :-
proof(implies(X,Y),proposition,Assumptions),
proof(Expr,Y,[(x(V),X)|Assumptions]).
proof(implies_elim(F,X),B,Assumptions) :-
proof(X,A,Assumptions),
proof(F,implies(A,B),Assumptions).