# HG changeset patch # User Mike Pavone # Date 1376031665 25200 # Node ID 301f16245955e3bd25b28eec70317500056fdf12 # Parent aac89683606e5b3abe8e244a67769bc2ac12da5d Add support for generating all programs up to size 3 inclusive diff -r aac89683606e -r 301f16245955 src/bv.tp --- 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 + } } }