summaryrefslogtreecommitdiff
path: root/ipl/progs/miu.icn
diff options
context:
space:
mode:
Diffstat (limited to 'ipl/progs/miu.icn')
-rw-r--r--ipl/progs/miu.icn80
1 files changed, 80 insertions, 0 deletions
diff --git a/ipl/progs/miu.icn b/ipl/progs/miu.icn
new file mode 100644
index 0000000..627629e
--- /dev/null
+++ b/ipl/progs/miu.icn
@@ -0,0 +1,80 @@
+############################################################################
+#
+# File: miu.icn
+#
+# Subject: Program to generate strings from MIU system
+#
+# Author: Cary A. Coutant, modified by Ralph E. Griswold
+#
+# Date: January 3, 1994
+#
+############################################################################
+#
+# This file is in the public domain.
+#
+############################################################################
+#
+# This program generates strings from the MIU string system.
+#
+# The number of generations is determined by the command-line argument.
+# The default is 7.
+#
+# Reference:
+#
+# Godel, Escher, and Bach: an Eternal Golden Braid, Douglas R.
+# Hofstadter, Basic Books, 1979. pp. 33-36.
+#
+############################################################################
+
+procedure main(arg)
+ local count, gen, limit
+
+ limit := integer(arg[1]) | 7
+ gen := set(["MI"])
+
+ every count := 1 to limit do {
+ gen := nextgen(gen)
+ show(count,gen)
+ }
+
+end
+
+# show - show a generation of strings
+
+procedure show(count,gen)
+
+ write("Generation #",count,", ",*gen," strings")
+ every write(" ",image(!sort(gen)))
+ write()
+
+end
+
+# nextgen - given a generation of strings, compute the next generation
+
+procedure nextgen(gen)
+ local new
+
+ new := set()
+ every insert(new,apply(!gen))
+ return new
+
+end
+
+# apply - produce all strings derivable from s in a single rule application
+
+procedure apply(s)
+
+# Here's a case where referring to the subject by name inside scanning
+# is justified.
+
+ s ? {
+ if ="M" then suspend s || tab(0)
+ tab(-1) # to last character
+ if ="I" then suspend s || "U"
+ tab(1) # back to the beginning
+ suspend tab(find("III")) || (move(3) & "U") || tab(0)
+ tab(1) # back to the beginning
+ suspend tab(find("UU")) || (move(2) & tab(0))
+ }
+
+end