shen-ruby 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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)