shen-ruby 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +4 -0
- data/.rspec +0 -0
- data/Gemfile +6 -0
- data/Gemfile.lock +20 -0
- data/MIT_LICENSE.txt +26 -0
- data/README.md +94 -0
- data/bin/shen_test_suite.rb +9 -0
- data/bin/srrepl +23 -0
- data/lib/kl.rb +7 -0
- data/lib/kl/absvector.rb +12 -0
- data/lib/kl/compiler.rb +253 -0
- data/lib/kl/cons.rb +51 -0
- data/lib/kl/empty_list.rb +12 -0
- data/lib/kl/environment.rb +123 -0
- data/lib/kl/error.rb +4 -0
- data/lib/kl/internal_error.rb +7 -0
- data/lib/kl/lexer.rb +186 -0
- data/lib/kl/primitives/arithmetic.rb +60 -0
- data/lib/kl/primitives/assignments.rb +18 -0
- data/lib/kl/primitives/booleans.rb +17 -0
- data/lib/kl/primitives/error_handling.rb +13 -0
- data/lib/kl/primitives/generic_functions.rb +22 -0
- data/lib/kl/primitives/lists.rb +21 -0
- data/lib/kl/primitives/streams.rb +38 -0
- data/lib/kl/primitives/strings.rb +55 -0
- data/lib/kl/primitives/symbols.rb +17 -0
- data/lib/kl/primitives/time.rb +17 -0
- data/lib/kl/primitives/vectors.rb +30 -0
- data/lib/kl/reader.rb +40 -0
- data/lib/kl/trampoline.rb +14 -0
- data/lib/shen_ruby.rb +7 -0
- data/lib/shen_ruby/version.rb +3 -0
- data/shen-ruby.gemspec +26 -0
- data/shen/README.txt +17 -0
- data/shen/lib/shen_ruby/shen.rb +124 -0
- data/shen/license.txt +34 -0
- data/shen/release/benchmarks/N_queens.shen +45 -0
- data/shen/release/benchmarks/README.shen +14 -0
- data/shen/release/benchmarks/benchmarks.shen +56 -0
- data/shen/release/benchmarks/bigprog +2173 -0
- data/shen/release/benchmarks/br.shen +13 -0
- data/shen/release/benchmarks/einstein.shen +33 -0
- data/shen/release/benchmarks/heatwave.gif +0 -0
- data/shen/release/benchmarks/interpreter.shen +219 -0
- data/shen/release/benchmarks/picture.jpg +0 -0
- data/shen/release/benchmarks/plato.jpg +0 -0
- data/shen/release/benchmarks/powerset.shen +10 -0
- data/shen/release/benchmarks/prime.shen +10 -0
- data/shen/release/benchmarks/short.shen +129 -0
- data/shen/release/benchmarks/text.txt +68 -0
- data/shen/release/k_lambda/core.kl +1002 -0
- data/shen/release/k_lambda/declarations.kl +1021 -0
- data/shen/release/k_lambda/load.kl +94 -0
- data/shen/release/k_lambda/macros.kl +479 -0
- data/shen/release/k_lambda/prolog.kl +1309 -0
- data/shen/release/k_lambda/reader.kl +1058 -0
- data/shen/release/k_lambda/sequent.kl +556 -0
- data/shen/release/k_lambda/sys.kl +582 -0
- data/shen/release/k_lambda/t-star.kl +3493 -0
- data/shen/release/k_lambda/toplevel.kl +223 -0
- data/shen/release/k_lambda/track.kl +208 -0
- data/shen/release/k_lambda/types.kl +455 -0
- data/shen/release/k_lambda/writer.kl +108 -0
- data/shen/release/k_lambda/yacc.kl +280 -0
- data/shen/release/test_programs/Chap13/problems.txt +26 -0
- data/shen/release/test_programs/README.shen +53 -0
- data/shen/release/test_programs/TinyLispFunctions.txt +16 -0
- data/shen/release/test_programs/TinyTypes.shen +55 -0
- data/shen/release/test_programs/binary.shen +24 -0
- data/shen/release/test_programs/bubble_version_1.shen +28 -0
- data/shen/release/test_programs/bubble_version_2.shen +22 -0
- data/shen/release/test_programs/calculator.shen +21 -0
- data/shen/release/test_programs/cartprod.shen +23 -0
- data/shen/release/test_programs/change.shen +25 -0
- data/shen/release/test_programs/classes-defaults.shen +94 -0
- data/shen/release/test_programs/classes-inheritance.shen +100 -0
- data/shen/release/test_programs/classes-typed.shen +74 -0
- data/shen/release/test_programs/classes-untyped.shen +46 -0
- data/shen/release/test_programs/depth_.shen +14 -0
- data/shen/release/test_programs/einstein.shen +33 -0
- data/shen/release/test_programs/fruit_machine.shen +46 -0
- data/shen/release/test_programs/interpreter.shen +219 -0
- data/shen/release/test_programs/metaprog.shen +85 -0
- data/shen/release/test_programs/minim.shen +193 -0
- data/shen/release/test_programs/mutual.shen +11 -0
- data/shen/release/test_programs/n_queens.shen +45 -0
- data/shen/release/test_programs/newton_version_1.shen +33 -0
- data/shen/release/test_programs/newton_version_2.shen +24 -0
- data/shen/release/test_programs/parse.prl +14 -0
- data/shen/release/test_programs/parser.shen +52 -0
- data/shen/release/test_programs/powerset.shen +10 -0
- data/shen/release/test_programs/prime.shen +10 -0
- data/shen/release/test_programs/proof_assistant.shen +81 -0
- data/shen/release/test_programs/proplog_version_1.shen +25 -0
- data/shen/release/test_programs/proplog_version_2.shen +27 -0
- data/shen/release/test_programs/qmachine.shen +67 -0
- data/shen/release/test_programs/red-black.shen +55 -0
- data/shen/release/test_programs/search.shen +56 -0
- data/shen/release/test_programs/semantic_net.shen +44 -0
- data/shen/release/test_programs/spreadsheet.shen +35 -0
- data/shen/release/test_programs/stack.shen +27 -0
- data/shen/release/test_programs/streams.shen +20 -0
- data/shen/release/test_programs/strings.shen +59 -0
- data/shen/release/test_programs/structures-typed.shen +71 -0
- data/shen/release/test_programs/structures-untyped.shen +42 -0
- data/shen/release/test_programs/tests.shen +294 -0
- data/shen/release/test_programs/types.shen +11 -0
- data/shen/release/test_programs/whist.shen +240 -0
- data/shen/release/test_programs/yacc.shen +136 -0
- data/spec/kl/cons_spec.rb +12 -0
- data/spec/kl/environment_spec.rb +306 -0
- data/spec/kl/lexer_spec.rb +149 -0
- data/spec/kl/primitives/generic_functions_spec.rb +29 -0
- data/spec/kl/primitives/symbols_spec.rb +21 -0
- data/spec/kl/reader_spec.rb +36 -0
- data/spec/spec_helper.rb +2 -0
- metadata +189 -0
@@ -0,0 +1,193 @@
|
|
1
|
+
\* <program> := <statement> <program> | <statement>;
|
2
|
+
<statement> := <assignment> | <conditional> | <goto> | <tag>;
|
3
|
+
<assignment> := (<var> := <val>) | (++ <var>); (-- <var>);
|
4
|
+
<var> := any symbol;
|
5
|
+
<val> := any number
|
6
|
+
<conditional> := (if <test> <statement> <statement>);
|
7
|
+
<test> := (<var> <comp> <var); (<test> and <test>);
|
8
|
+
(<test> or <test>) | (not <test>);
|
9
|
+
<comp> := > | < | =; *\
|
10
|
+
|
11
|
+
(synonyms program (list statement)
|
12
|
+
env (list (symbol * number)))
|
13
|
+
|
14
|
+
(datatype statement
|
15
|
+
|
16
|
+
Var : symbol; Val : val;
|
17
|
+
=========================
|
18
|
+
[Var := Val] : statement;
|
19
|
+
|
20
|
+
if (element? Op [++ --])
|
21
|
+
Var : symbol;
|
22
|
+
=====================
|
23
|
+
[Op Var] : statement;
|
24
|
+
|
25
|
+
Test : test; DoThis : statement; DoThat : statement;
|
26
|
+
====================================================
|
27
|
+
[if Test then DoThis else DoThat] : statement;
|
28
|
+
|
29
|
+
Tag : symbol;
|
30
|
+
======================
|
31
|
+
[goto Tag] : statement;
|
32
|
+
|
33
|
+
Message : string-or-val;
|
34
|
+
============================
|
35
|
+
[print Message] : statement;
|
36
|
+
|
37
|
+
Message : string;
|
38
|
+
_________________
|
39
|
+
Message : string-or-val;
|
40
|
+
|
41
|
+
Message : val;
|
42
|
+
_________________
|
43
|
+
Message : string-or-val;
|
44
|
+
|
45
|
+
Var : symbol;
|
46
|
+
=========================
|
47
|
+
[input Var] : statement;
|
48
|
+
|
49
|
+
Tag : symbol;
|
50
|
+
_____________
|
51
|
+
Tag : statement;)
|
52
|
+
|
53
|
+
(datatype test
|
54
|
+
|
55
|
+
if (element? Comp [= > <])
|
56
|
+
Val1 : val; Val2: val;
|
57
|
+
======================
|
58
|
+
[Val1 Comp Val2] : test;
|
59
|
+
|
60
|
+
|
61
|
+
if (element? LogOp [and or])
|
62
|
+
Test1 : test;
|
63
|
+
Test2 : test;
|
64
|
+
=============
|
65
|
+
[Test1 LogOp Test2] : test;
|
66
|
+
|
67
|
+
|
68
|
+
Test : test;
|
69
|
+
==================
|
70
|
+
[not Test] : test;)
|
71
|
+
|
72
|
+
|
73
|
+
(datatype val
|
74
|
+
|
75
|
+
|
76
|
+
______________________________________
|
77
|
+
(number? N) : verified >> N : number;
|
78
|
+
|
79
|
+
|
80
|
+
_______________________________________
|
81
|
+
(symbol? S) : verified >> S : symbol;
|
82
|
+
|
83
|
+
|
84
|
+
Val : symbol;
|
85
|
+
_______________
|
86
|
+
Val : val;
|
87
|
+
|
88
|
+
|
89
|
+
Val : number;
|
90
|
+
_____________
|
91
|
+
Val : val;)
|
92
|
+
|
93
|
+
|
94
|
+
\* The program that runs Minim programs is 56 lines of Qi and is given here. *\
|
95
|
+
|
96
|
+
|
97
|
+
(define run
|
98
|
+
{program --> env}
|
99
|
+
Program -> (run-loop Program Program []))
|
100
|
+
|
101
|
+
|
102
|
+
(define run-loop
|
103
|
+
{program --> program --> env --> env}
|
104
|
+
[] _ Env -> Env
|
105
|
+
[nl | Ss] Program Env -> (do (output "~%") (run-loop Ss Program Env))
|
106
|
+
[Tag | Ss] Program Env -> (run-loop Ss Program Env) where (symbol? Tag)
|
107
|
+
[[goto Tag] | _] Program Env -> (run-loop (go Tag Program) Program Env)
|
108
|
+
[[Var := Val] | Ss] Program Env
|
109
|
+
-> (run-loop Ss Program (change-env Var (compute-val Val Env) Env))
|
110
|
+
[[++ Var] | Ss] Program Env
|
111
|
+
-> (run-loop Ss Program (change-env Var (+ 1 (look-up Var Env)) Env))
|
112
|
+
[[-- Var] | Ss] Program Env
|
113
|
+
-> (run-loop Ss Program (change-env Var (- (look-up Var Env) 1) Env))
|
114
|
+
[[if Test then DoThis else DoThat] | Ss] Program Env
|
115
|
+
-> (if (perform-test? Test Env)
|
116
|
+
(run-loop [DoThis | Ss] Program Env)
|
117
|
+
(run-loop [DoThat | Ss] Program Env))
|
118
|
+
[[print M] | Ss] Program Env -> (do (output "~A" (look-up M Env))
|
119
|
+
(run-loop Ss Program Env))
|
120
|
+
where (symbol? M)
|
121
|
+
[[print M] | Ss] Program Env -> (do (output "~A" M)
|
122
|
+
(run-loop Ss Program Env))
|
123
|
+
[[input Var] | Ss] Program Env
|
124
|
+
-> (run-loop Ss Program (change-env Var (input+ : number) Env)) )
|
125
|
+
|
126
|
+
(define compute-val
|
127
|
+
{val --> env --> number}
|
128
|
+
N _ -> N where (number? N)
|
129
|
+
Var Env -> (look-up Var Env) where (symbol? Var))
|
130
|
+
|
131
|
+
(define go
|
132
|
+
{symbol --> program --> program}
|
133
|
+
Tag [Tag | Program] -> Program
|
134
|
+
Tag [_ | Program] -> (go Tag Program)
|
135
|
+
Tag _ -> (error "cannot go to tag ~A~%" Tag))
|
136
|
+
|
137
|
+
(define perform-test?
|
138
|
+
{test --> env --> boolean}
|
139
|
+
[Test1 and Test2] Env -> (and (perform-test? Test1 Env)
|
140
|
+
(perform-test? Test2 Env))
|
141
|
+
[Test1 or Test2] Env -> (or (perform-test? Test1 Env)
|
142
|
+
(perform-test? Test2 Env))
|
143
|
+
[not Test] Env -> (not (perform-test? Test Env))
|
144
|
+
[V1 = V2] Env -> (= (compute-val V1 Env) (compute-val V2 Env))
|
145
|
+
[V1 > V2] Env -> (> (compute-val V1 Env) (compute-val V2 Env))
|
146
|
+
[V1 < V2] Env -> (< (compute-val V1 Env) (compute-val V2 Env)))
|
147
|
+
|
148
|
+
(define change-env
|
149
|
+
{symbol --> number --> env --> env}
|
150
|
+
Var Val [] -> [(@p Var Val)]
|
151
|
+
Var Val [(@p Var _) | Env] -> [(@p Var Val) | Env]
|
152
|
+
Var Val [Binding | Env] -> [Binding | (change-env Var Val Env)])
|
153
|
+
|
154
|
+
(define look-up
|
155
|
+
{symbol --> env --> number}
|
156
|
+
Var [] -> (error "~A is unbound.~%" Var)
|
157
|
+
Var [(@p Var Val) | _] -> Val
|
158
|
+
Var [_ | Env] -> (look-up Var Env))
|
159
|
+
|
160
|
+
\* (run [ [print "Add x and y"]
|
161
|
+
nl
|
162
|
+
[print "Input x: "]
|
163
|
+
[input x]
|
164
|
+
nl
|
165
|
+
[print "Input y: "]
|
166
|
+
[input y]
|
167
|
+
main
|
168
|
+
[if [x = 0] then [goto end] else [goto sub1x]]
|
169
|
+
|
170
|
+
|
171
|
+
sub1x
|
172
|
+
[-- x]
|
173
|
+
[++ y]
|
174
|
+
[goto main]
|
175
|
+
|
176
|
+
|
177
|
+
end
|
178
|
+
nl
|
179
|
+
[print "The total of x and y is "]
|
180
|
+
[print y]
|
181
|
+
nl] ) *\
|
182
|
+
|
183
|
+
|
184
|
+
|
185
|
+
|
186
|
+
|
187
|
+
|
188
|
+
|
189
|
+
|
190
|
+
|
191
|
+
|
192
|
+
|
193
|
+
|
@@ -0,0 +1,45 @@
|
|
1
|
+
(define n-queens
|
2
|
+
{number --> (list (list number))}
|
3
|
+
N -> (n-queens-loop N (initialise N)))
|
4
|
+
|
5
|
+
(define initialise
|
6
|
+
{number --> (list number)}
|
7
|
+
0 -> []
|
8
|
+
N -> [1 | (initialise (- N 1))])
|
9
|
+
|
10
|
+
(define n-queens-loop
|
11
|
+
{number --> (list number) --> (list (list number))}
|
12
|
+
N Config -> [] where (all_Ns? N Config)
|
13
|
+
N Config -> [Config | (n-queens-loop N (next_n N Config))]
|
14
|
+
where (and (ok_row? Config) (ok_diag? Config))
|
15
|
+
N Config -> (n-queens-loop N (next_n N Config)))
|
16
|
+
|
17
|
+
(define all_Ns?
|
18
|
+
{number --> (list number) --> boolean}
|
19
|
+
_ [] -> true
|
20
|
+
N [N | Ns] -> (all_Ns? N Ns)
|
21
|
+
_ _ -> false)
|
22
|
+
|
23
|
+
(define next_n
|
24
|
+
{number --> (list number) --> (list number)}
|
25
|
+
N [N | Ns] -> [1 | (next_n N Ns)]
|
26
|
+
_ [N | Ns] -> [(+ 1 N) | Ns])
|
27
|
+
|
28
|
+
(define ok_row?
|
29
|
+
{(list number) --> boolean}
|
30
|
+
[] -> true
|
31
|
+
[N | Ns] -> false where (element? N Ns)
|
32
|
+
[_ | Ns] -> (ok_row? Ns))
|
33
|
+
|
34
|
+
(define ok_diag?
|
35
|
+
{(list number) --> boolean}
|
36
|
+
[] -> true
|
37
|
+
[N | Ns] -> (and (ok_diag_N? (+ N 1) (- N 1) Ns)
|
38
|
+
(ok_diag? Ns)))
|
39
|
+
|
40
|
+
(define ok_diag_N?
|
41
|
+
{number --> number --> (list number) --> boolean}
|
42
|
+
_ _ [] -> true
|
43
|
+
Up Down [Up | _] -> false
|
44
|
+
Up Down [Down | _] -> false
|
45
|
+
Up Down [_ | Ns] -> (ok_diag_N? (+ 1 Up) (- Down 1) Ns))
|
@@ -0,0 +1,33 @@
|
|
1
|
+
(define newtons-method
|
2
|
+
N -> (let Guess (/ N 2.0)
|
3
|
+
(run-newtons-method
|
4
|
+
N
|
5
|
+
(round-to-2-places (average Guess (/ N Guess)))
|
6
|
+
Guess)))
|
7
|
+
|
8
|
+
(define run-newtons-method
|
9
|
+
_ Sqrt Sqrt -> Sqrt
|
10
|
+
N Better_Guess _
|
11
|
+
-> (run-newtons-method
|
12
|
+
N
|
13
|
+
(round-to-2-places (average Better_Guess (/ N Better_Guess)))
|
14
|
+
Better_Guess))
|
15
|
+
|
16
|
+
(define round-to-2-places
|
17
|
+
N -> (/ (round (* 100.0 N)) 100.0))
|
18
|
+
|
19
|
+
(define average
|
20
|
+
M N -> (/ (+ M N) 2.0))
|
21
|
+
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
|
26
|
+
|
27
|
+
|
28
|
+
|
29
|
+
|
30
|
+
|
31
|
+
|
32
|
+
|
33
|
+
|
@@ -0,0 +1,24 @@
|
|
1
|
+
(define newtons-method
|
2
|
+
N -> (fix (/. M (specialised-run-newtons-method N M)) (/ N 2.0)))
|
3
|
+
|
4
|
+
(define specialised-run-newtons-method
|
5
|
+
M N -> (round-to-2-places (average N (/ M N))))
|
6
|
+
|
7
|
+
(define round-to-2-places
|
8
|
+
M -> (/ (round (* 100.0 M)) 100.0))
|
9
|
+
|
10
|
+
(define average
|
11
|
+
M N -> (/ (+ M N) 2.0))
|
12
|
+
|
13
|
+
|
14
|
+
|
15
|
+
|
16
|
+
|
17
|
+
|
18
|
+
|
19
|
+
|
20
|
+
|
21
|
+
|
22
|
+
|
23
|
+
|
24
|
+
|
@@ -0,0 +1,14 @@
|
|
1
|
+
(defprolog pparse
|
2
|
+
S Grammar <-- (parsing [[s + 0] = [S + 0]] Grammar);)
|
3
|
+
|
4
|
+
(defprolog parsing
|
5
|
+
[X = X] _ <--;
|
6
|
+
[[X + Y] = [X + Z]] Grammar <-- ! (parsing [Y = Z] Grammar);
|
7
|
+
[[[X + Y] + Z] = W] Grammar <-- ! (parsing [[X + [Y + Z]] = W] Grammar);
|
8
|
+
[W = [[X + Y] + Z]] Grammar <-- ! (parsing [W = [X + [Y + Z]]] Grammar);
|
9
|
+
[[X + Y] = Z] Grammar <-- (member [X = W] Grammar) (parsing [[W + Y] = Z] Grammar);)
|
10
|
+
|
11
|
+
(defprolog member
|
12
|
+
X [X | _] <--;
|
13
|
+
X [_ | Y] <-- (member X Y);)
|
14
|
+
|
@@ -0,0 +1,52 @@
|
|
1
|
+
(define parse
|
2
|
+
Sentence -> (let Parse (sent [Sentence []])
|
3
|
+
(if (parsed? Parse)
|
4
|
+
(output_parse Parse)
|
5
|
+
ungrammatical)))
|
6
|
+
|
7
|
+
(define parsed?
|
8
|
+
[[] _] -> true
|
9
|
+
_ -> false)
|
10
|
+
|
11
|
+
(define output_parse
|
12
|
+
[_ Parse_Rules] -> (reverse Parse_Rules))
|
13
|
+
|
14
|
+
(define sent
|
15
|
+
[Input Output] <- (vp (np [Input [[sent --> np vp] | Output]]))
|
16
|
+
_ -> (fail))
|
17
|
+
|
18
|
+
(define np
|
19
|
+
[Input Output] <- (n (det [Input [[np --> det n] | Output]]))
|
20
|
+
[Input Output] <- (name [Input [[np --> name] | Output]])
|
21
|
+
_ -> (fail))
|
22
|
+
|
23
|
+
(define name
|
24
|
+
[["John" | Input] Output] -> [Input [[name --> "John"] | Output]]
|
25
|
+
[["Bill" | Input] Output] -> [Input [[name --> "Bill"] | Output]]
|
26
|
+
_ -> (fail))
|
27
|
+
|
28
|
+
(define det
|
29
|
+
[["the" | Input] Output] -> [Input [[det --> "the"] | Output]]
|
30
|
+
[["a" | Input] Output] -> [Input [[det --> "a"] | Output]]
|
31
|
+
[["that" | Input] Output] -> [Input [[det --> "that"] | Output]]
|
32
|
+
[["this" | Input] Output] -> [Input [[det --> "this"] | Output]]
|
33
|
+
_ -> (fail))
|
34
|
+
|
35
|
+
(define n
|
36
|
+
[["boy" | Input] Output] -> [Input [[n --> "boy"] | Output]]
|
37
|
+
[["girl" | Input] Output] -> [Input [[n --> "girl"] | Output]]
|
38
|
+
_ -> (fail))
|
39
|
+
|
40
|
+
(define vp
|
41
|
+
[Input Output] <- (np (vtrans [Input [[vp --> vtrans np] | Output]]))
|
42
|
+
[Input Output] <- (vp [Input [[vp --> vintrans] | Output]])
|
43
|
+
_ -> (fail))
|
44
|
+
|
45
|
+
(define vtrans
|
46
|
+
[["kicks" | Input] Output] -> [Input [[vtrans --> "kicks"] | Output]]
|
47
|
+
[["likes" | Input] Output] -> [Input [[vtrans --> "likes"] | Output]]
|
48
|
+
_ -> (fail))
|
49
|
+
|
50
|
+
(define vintrans
|
51
|
+
[["jumps" | Input] Output] -> [Input [[vintrans --> "jumps"] | Output]]
|
52
|
+
_ -> (fail))
|
@@ -0,0 +1,81 @@
|
|
1
|
+
(synonyms
|
2
|
+
|
3
|
+
proof (list step)
|
4
|
+
step ((list sequent) * tactic)
|
5
|
+
tactic ((list sequent) --> (list sequent))
|
6
|
+
sequent ((list wff) * wff))
|
7
|
+
|
8
|
+
(datatype globals
|
9
|
+
|
10
|
+
_______________________
|
11
|
+
(value *proof*) : proof;)
|
12
|
+
|
13
|
+
(define proof-assistant
|
14
|
+
{A --> symbol}
|
15
|
+
_ -> (let Assumptions (input-assumptions 1)
|
16
|
+
Conclusion (input-conclusion _)
|
17
|
+
Sequents [(@p Assumptions Conclusion)]
|
18
|
+
Proof (time (proof-loop Sequents []))
|
19
|
+
(do (nl) proved)))
|
20
|
+
|
21
|
+
(define input-assumptions
|
22
|
+
{number --> (list wff)}
|
23
|
+
N -> (let More? (y-or-n? "~%Input assumptions? ")
|
24
|
+
(if More?
|
25
|
+
(do (output "~%~A. " N)
|
26
|
+
[(input+ : wff) | (input-assumptions (+ N 1))])
|
27
|
+
[ ])))
|
28
|
+
|
29
|
+
(define input-conclusion
|
30
|
+
{A --> wff}
|
31
|
+
_ -> (do (output "~%Enter conclusion: ") (input+ : wff)))
|
32
|
+
|
33
|
+
(define proof-loop
|
34
|
+
{(list sequent) --> proof --> proof}
|
35
|
+
[ ] Proof -> (set *proof* (reverse Proof))
|
36
|
+
S Proof -> (let Show (show-sequent S (+ 1 (length Proof)))
|
37
|
+
D (user-directive _)
|
38
|
+
Step (@p S D)
|
39
|
+
(if (= D back)
|
40
|
+
(proof-loop (go-back Proof) (tail Proof))
|
41
|
+
(proof-loop (D S) [Step | Proof]))))
|
42
|
+
|
43
|
+
(define show-proof
|
44
|
+
{string --> symbol}
|
45
|
+
S -> (show-proof-help (value *proof*) 1))
|
46
|
+
|
47
|
+
(define show-proof-help
|
48
|
+
{proof --> number --> symbol}
|
49
|
+
[ ] _ -> proved
|
50
|
+
[(@p Sequents Tactic) | Proof] N -> (do (show-sequent Sequents N)
|
51
|
+
(output "~%Tactic: ~A~%" Tactic)
|
52
|
+
(show-proof-help Proof (+ N 1))))
|
53
|
+
|
54
|
+
(define show-sequent
|
55
|
+
{(list sequent) --> number --> symbol}
|
56
|
+
Sequents N -> (let Unsolved (length Sequents)
|
57
|
+
Sequent (head Sequents)
|
58
|
+
Wffs (fst Sequent)
|
59
|
+
Wff (snd Sequent)
|
60
|
+
(do (output "==============================~%")
|
61
|
+
(output "Step ~A unsolved ~A~%~%"
|
62
|
+
N Unsolved)
|
63
|
+
(output "?- ~S~%~%" Wff)
|
64
|
+
(enumerate Wffs 1))))
|
65
|
+
|
66
|
+
(define enumerate
|
67
|
+
{(list A) --> number --> symbol}
|
68
|
+
[] _ -> _
|
69
|
+
[X | Y] N -> (do (output "~A. ~S~%" N X) (enumerate Y (+ N 1))))
|
70
|
+
|
71
|
+
(define user-directive
|
72
|
+
{A --> tactic}
|
73
|
+
_ -> (do (output "~%Tactic: ") (input+ : tactic)))
|
74
|
+
|
75
|
+
(define back
|
76
|
+
{(list sequent) --> (list sequent)}
|
77
|
+
S -> S)
|
78
|
+
|
79
|
+
(define go-back
|
80
|
+
{proof --> (list sequent)}
|
81
|
+
[(@p S _) | _] -> S)
|