shen-ruby 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. data/.gitignore +4 -0
  2. data/.rspec +0 -0
  3. data/Gemfile +6 -0
  4. data/Gemfile.lock +20 -0
  5. data/MIT_LICENSE.txt +26 -0
  6. data/README.md +94 -0
  7. data/bin/shen_test_suite.rb +9 -0
  8. data/bin/srrepl +23 -0
  9. data/lib/kl.rb +7 -0
  10. data/lib/kl/absvector.rb +12 -0
  11. data/lib/kl/compiler.rb +253 -0
  12. data/lib/kl/cons.rb +51 -0
  13. data/lib/kl/empty_list.rb +12 -0
  14. data/lib/kl/environment.rb +123 -0
  15. data/lib/kl/error.rb +4 -0
  16. data/lib/kl/internal_error.rb +7 -0
  17. data/lib/kl/lexer.rb +186 -0
  18. data/lib/kl/primitives/arithmetic.rb +60 -0
  19. data/lib/kl/primitives/assignments.rb +18 -0
  20. data/lib/kl/primitives/booleans.rb +17 -0
  21. data/lib/kl/primitives/error_handling.rb +13 -0
  22. data/lib/kl/primitives/generic_functions.rb +22 -0
  23. data/lib/kl/primitives/lists.rb +21 -0
  24. data/lib/kl/primitives/streams.rb +38 -0
  25. data/lib/kl/primitives/strings.rb +55 -0
  26. data/lib/kl/primitives/symbols.rb +17 -0
  27. data/lib/kl/primitives/time.rb +17 -0
  28. data/lib/kl/primitives/vectors.rb +30 -0
  29. data/lib/kl/reader.rb +40 -0
  30. data/lib/kl/trampoline.rb +14 -0
  31. data/lib/shen_ruby.rb +7 -0
  32. data/lib/shen_ruby/version.rb +3 -0
  33. data/shen-ruby.gemspec +26 -0
  34. data/shen/README.txt +17 -0
  35. data/shen/lib/shen_ruby/shen.rb +124 -0
  36. data/shen/license.txt +34 -0
  37. data/shen/release/benchmarks/N_queens.shen +45 -0
  38. data/shen/release/benchmarks/README.shen +14 -0
  39. data/shen/release/benchmarks/benchmarks.shen +56 -0
  40. data/shen/release/benchmarks/bigprog +2173 -0
  41. data/shen/release/benchmarks/br.shen +13 -0
  42. data/shen/release/benchmarks/einstein.shen +33 -0
  43. data/shen/release/benchmarks/heatwave.gif +0 -0
  44. data/shen/release/benchmarks/interpreter.shen +219 -0
  45. data/shen/release/benchmarks/picture.jpg +0 -0
  46. data/shen/release/benchmarks/plato.jpg +0 -0
  47. data/shen/release/benchmarks/powerset.shen +10 -0
  48. data/shen/release/benchmarks/prime.shen +10 -0
  49. data/shen/release/benchmarks/short.shen +129 -0
  50. data/shen/release/benchmarks/text.txt +68 -0
  51. data/shen/release/k_lambda/core.kl +1002 -0
  52. data/shen/release/k_lambda/declarations.kl +1021 -0
  53. data/shen/release/k_lambda/load.kl +94 -0
  54. data/shen/release/k_lambda/macros.kl +479 -0
  55. data/shen/release/k_lambda/prolog.kl +1309 -0
  56. data/shen/release/k_lambda/reader.kl +1058 -0
  57. data/shen/release/k_lambda/sequent.kl +556 -0
  58. data/shen/release/k_lambda/sys.kl +582 -0
  59. data/shen/release/k_lambda/t-star.kl +3493 -0
  60. data/shen/release/k_lambda/toplevel.kl +223 -0
  61. data/shen/release/k_lambda/track.kl +208 -0
  62. data/shen/release/k_lambda/types.kl +455 -0
  63. data/shen/release/k_lambda/writer.kl +108 -0
  64. data/shen/release/k_lambda/yacc.kl +280 -0
  65. data/shen/release/test_programs/Chap13/problems.txt +26 -0
  66. data/shen/release/test_programs/README.shen +53 -0
  67. data/shen/release/test_programs/TinyLispFunctions.txt +16 -0
  68. data/shen/release/test_programs/TinyTypes.shen +55 -0
  69. data/shen/release/test_programs/binary.shen +24 -0
  70. data/shen/release/test_programs/bubble_version_1.shen +28 -0
  71. data/shen/release/test_programs/bubble_version_2.shen +22 -0
  72. data/shen/release/test_programs/calculator.shen +21 -0
  73. data/shen/release/test_programs/cartprod.shen +23 -0
  74. data/shen/release/test_programs/change.shen +25 -0
  75. data/shen/release/test_programs/classes-defaults.shen +94 -0
  76. data/shen/release/test_programs/classes-inheritance.shen +100 -0
  77. data/shen/release/test_programs/classes-typed.shen +74 -0
  78. data/shen/release/test_programs/classes-untyped.shen +46 -0
  79. data/shen/release/test_programs/depth_.shen +14 -0
  80. data/shen/release/test_programs/einstein.shen +33 -0
  81. data/shen/release/test_programs/fruit_machine.shen +46 -0
  82. data/shen/release/test_programs/interpreter.shen +219 -0
  83. data/shen/release/test_programs/metaprog.shen +85 -0
  84. data/shen/release/test_programs/minim.shen +193 -0
  85. data/shen/release/test_programs/mutual.shen +11 -0
  86. data/shen/release/test_programs/n_queens.shen +45 -0
  87. data/shen/release/test_programs/newton_version_1.shen +33 -0
  88. data/shen/release/test_programs/newton_version_2.shen +24 -0
  89. data/shen/release/test_programs/parse.prl +14 -0
  90. data/shen/release/test_programs/parser.shen +52 -0
  91. data/shen/release/test_programs/powerset.shen +10 -0
  92. data/shen/release/test_programs/prime.shen +10 -0
  93. data/shen/release/test_programs/proof_assistant.shen +81 -0
  94. data/shen/release/test_programs/proplog_version_1.shen +25 -0
  95. data/shen/release/test_programs/proplog_version_2.shen +27 -0
  96. data/shen/release/test_programs/qmachine.shen +67 -0
  97. data/shen/release/test_programs/red-black.shen +55 -0
  98. data/shen/release/test_programs/search.shen +56 -0
  99. data/shen/release/test_programs/semantic_net.shen +44 -0
  100. data/shen/release/test_programs/spreadsheet.shen +35 -0
  101. data/shen/release/test_programs/stack.shen +27 -0
  102. data/shen/release/test_programs/streams.shen +20 -0
  103. data/shen/release/test_programs/strings.shen +59 -0
  104. data/shen/release/test_programs/structures-typed.shen +71 -0
  105. data/shen/release/test_programs/structures-untyped.shen +42 -0
  106. data/shen/release/test_programs/tests.shen +294 -0
  107. data/shen/release/test_programs/types.shen +11 -0
  108. data/shen/release/test_programs/whist.shen +240 -0
  109. data/shen/release/test_programs/yacc.shen +136 -0
  110. data/spec/kl/cons_spec.rb +12 -0
  111. data/spec/kl/environment_spec.rb +306 -0
  112. data/spec/kl/lexer_spec.rb +149 -0
  113. data/spec/kl/primitives/generic_functions_spec.rb +29 -0
  114. data/spec/kl/primitives/symbols_spec.rb +21 -0
  115. data/spec/kl/reader_spec.rb +36 -0
  116. data/spec/spec_helper.rb +2 -0
  117. 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,11 @@
1
+ (define even?
2
+ 1 -> false
3
+ X -> (odd? (- X 1)))
4
+
5
+ (define odd?
6
+ 1 -> true
7
+ X -> (even? (- X 1)))
8
+
9
+
10
+
11
+
@@ -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,10 @@
1
+ (define powerset
2
+ [] -> [[]]
3
+ [X | Y] -> (let Powerset (powerset Y)
4
+ (append (cons-X-to-each-set X Powerset) Powerset)))
5
+
6
+ (define cons-X-to-each-set
7
+ _ [ ] -> [ ]
8
+ X [Y | Z] -> [[X | Y] | (cons-X-to-each-set X Z)])
9
+
10
+
@@ -0,0 +1,10 @@
1
+ (define prime?
2
+ X -> (prime* X (/ X 2) 2))
3
+
4
+ (define prime*
5
+ X Max Div -> false where (integer? (/ X Div))
6
+ X Max Div -> true where (> Div Max)
7
+ X Max Div -> (prime* X Max (+ 1 Div)))
8
+
9
+
10
+
@@ -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)