comparison src/bv.tp @ 7:301f16245955

Add support for generating all programs up to size 3 inclusive
author Mike Pavone <pavone@retrodev.com>
date Fri, 09 Aug 2013 00:01:05 -0700
parents 538440e1c3d2
children 3f0172ceab81
comparison
equal deleted inserted replaced
6:aac89683606e 7:301f16245955
155 155
156 exampleprog <- { 156 exampleprog <- {
157 root <- fold: input with: (opOr: val acc) startingAt: zero 157 root <- fold: input with: (opOr: val acc) startingAt: zero
158 self 158 self
159 } 159 }
160
161 //TODO: memoize this to improve runtime for large n
162 allOfSize:inFold? <- :n :infold? {
163 if: n = 1 {
164 res <- #[one zero input]
165 if: infold? {
166 res append: acc
167 res append: val
168 }
169 res
170 } else: {
171 res <- #[]
172 foreach: (allOfSize: n - 1 inFold?: infold?) :idx exp {
173 res append: (opNot: exp)
174 res append: (shl1: exp)
175 res append: (shr1: exp)
176 res append: (shr4: exp)
177 res append: (shr16: exp)
178 }
179 if: n > 2 {
180 numLeft <- 1
181 argTotal <- n - 1
182 while: { numLeft < argTotal } do: {
183 numRight <- argTotal - numLeft
184 choicesRight <- (allOfSize: numRight inFold?: infold?)
185 foreach: (allOfSize: numLeft inFold?: infold?) :idx leftExp {
186 foreach: choicesRight :idx rightExp {
187 res append: (opAnd: leftExp rightExp)
188 res append: (opOr: leftExp rightExp)
189 res append: (opXor: leftExp rightExp)
190 res append: (plus: leftExp rightExp)
191 }
192 }
193 numLeft <- numLeft + 1
194 }
195 }
196 res
197 }
198 }
199
200 allOfSize <- :n {
201 allOfSize: n inFold?: false
202 }
160 } 203 }
161 } 204 }
162 205
163 test <- :prog { 206 test <- :prog {
164 print: (string: prog) . "\n" 207 print: (string: prog) . "\n"
171 } 214 }
172 215
173 main <- { 216 main <- {
174 test: (program gentestprog) 217 test: (program gentestprog)
175 test: (program exampleprog) 218 test: (program exampleprog)
219 prog <- program
220 foreach: (prog allOfSize: 3) :idx tree {
221 prog root! tree
222 test: prog
223 }
176 } 224 }
177 } 225 }