changeset 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 aac89683606e
children 3f0172ceab81 79c1db5e7ebd
files src/bv.tp
diffstat 1 files changed, 48 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/bv.tp	Thu Aug 08 22:32:48 2013 -0700
+++ b/src/bv.tp	Fri Aug 09 00:01:05 2013 -0700
@@ -157,6 +157,49 @@
 				root <- fold: input with: (opOr: val acc) startingAt: zero
 				self
 			}
+
+			//TODO: memoize this to improve runtime for large n
+			allOfSize:inFold? <- :n :infold? {
+				if: n = 1 {
+					res <- #[one zero input]
+					if: infold? {
+						res append: acc
+						res append: val
+					}
+					res
+				} else: {
+					res <- #[]
+					foreach: (allOfSize: n - 1 inFold?: infold?) :idx exp {
+						res append: (opNot: exp)
+						res append: (shl1: exp)
+						res append: (shr1: exp)
+						res append: (shr4: exp)
+						res append: (shr16: exp)
+					}
+					if: n > 2 {
+						numLeft <- 1
+						argTotal <- n - 1
+						while: { numLeft < argTotal } do: {
+							numRight <- argTotal - numLeft
+							choicesRight <- (allOfSize: numRight inFold?: infold?)
+							foreach: (allOfSize: numLeft inFold?: infold?) :idx leftExp {
+								foreach: choicesRight :idx rightExp {
+									res append: (opAnd: leftExp rightExp)
+									res append: (opOr: leftExp rightExp)
+									res append: (opXor: leftExp rightExp)
+									res append: (plus: leftExp rightExp)
+								}
+							}
+							numLeft <- numLeft + 1
+						}
+					}
+					res
+				}
+			}
+
+			allOfSize <- :n {
+				allOfSize: n inFold?: false
+			}
 		}
 	}
 
@@ -173,5 +216,10 @@
 	main <- {
 		test: (program gentestprog)
 		test: (program exampleprog)
+		prog <- program
+		foreach: (prog allOfSize: 3) :idx tree {
+			prog root! tree
+			test: prog
+		}
 	}
 }