Thue Sequences, Lambda Calculus Circular Program
Thue sequences, after Axel Thue, are sequences over an alphabet of three {1, 2, 3} such that no subsequence is immediately repeated. For example, 1213121 is a Thue sequence that cannot be extended 12131211 ×, 12131212 ×, 12131213 ×. However, there are Thue sequences of any length. (There are no solutions longer than 3 for binary sequences, and finding solutions is easier for alphabets larger than three.)
The ''circular program'' below builds a tree of Thue sequences. Note that within function 'build', the tree data-structure 'T' and functions 'toplevel' and 'f' are mutually recursive. The program relies on the fact that a partial soln 'abcde' can be extended with 'f' iff its shadow, 'bcdef', is already in tree at the previous level; this avoids repeating many tests on constraints that have already been treated at a higher level. The subtree for 'abcde' is the subtree of 'bcde' less any 'a' nodes. The tree of all solutions is notionally infinite, but the program prints one branch to a finite depth so only a finite part of the tree is evaluated thanks to lazy evaluation.
- See L. Allison. Applications of Recursively Defined Data Structures. Australian Computer Journal, 25(1), pp.14-20, Feb 1993.
let rec even = lambda n. (n/2)*2=n, repeated = lambda len. lambda s. { test: ? s = s2;s2 ? } let rec r = lambda half. lambda s2. if half=len/2 then let rec r2 = lambda s1. lambda s2. if null s2 then true else if hd s1=hd s2 then r2 tl s1 tl s2 else false in r2 s tl s2 else r (half+1) tl s2 in r 1 s, paths = lambda depth. lambda T. {paths from root of T to a given depth} let rec across = lambda d. lambda Ancestors. lambda T. lambda Rest. if null T then Rest else down d (hd T :: Ancestors) (hd tl T) (across d Ancestors tl tl T Rest), down = lambda d. lambda Ancestors. lambda T. lambda Rest. if d >= depth then Ancestors :: Rest else {d < depth} across (d+1) Ancestors T Rest in across 1 nil T nil in let { build does the work } build = lambda N. let rec T = toplevel 1, toplevel = lambda M. if M > N then nil else M :: ((f 2 (M::nil) T) :: (toplevel (M+1))), f = lambda len. lambda seq. lambda Shadow. if null Shadow then nil else let others = f len seq tl tl Shadow, seq2 = hd Shadow :: seq in if even len and repeated len seq2 then others else (hd Shadow) :: ((f (len+1) seq2 hd tl Shadow)::others) in T in hd( paths 20 ( build 3 )) {print one} {\fB Tree of Thue Sequences. \fP} {see: L. Allison, Applications of Recursively Defined Data Structures. Australian Computer Journal 25(1) 14-20 Feb 1993 ---------------------------------------------------------- tree == list of (elt x subtree) NB. `T' is a self-referential data structure i.e. a circular program. 123 note that a partial soln `abcde' 32 can be extended with f iff 213 its shadow, `bcdef', is already 31 in tree at previous level. The subtree 312 for abcde is the subtree of bcde 21 less any `a' nodes. }
Also see:
- L. Allison, Circular programs and self-referential structures, Software Practice and Experience 19(2) pp99-109, Feb 1989.