summaryrefslogtreecommitdiff
path: root/miralib/ex/polish.m
diff options
context:
space:
mode:
authorJakob Kaivo <jkk@ung.org>2022-03-04 12:32:20 -0500
committerJakob Kaivo <jkk@ung.org>2022-03-04 12:32:20 -0500
commit55f277e77428d7423ae906a8e1f1324d35b07a7d (patch)
tree5c1c04703dff89c46b349025d2d3ec88ea9b3819 /miralib/ex/polish.m
import Miranda 2.066 from upstream
Diffstat (limited to 'miralib/ex/polish.m')
-rw-r--r--miralib/ex/polish.m34
1 files changed, 34 insertions, 0 deletions
diff --git a/miralib/ex/polish.m b/miralib/ex/polish.m
new file mode 100644
index 0000000..21e58a5
--- /dev/null
+++ b/miralib/ex/polish.m
@@ -0,0 +1,34 @@
+||very simple testbed for Miranda unification package, "unify.m"
+
+||The expressions to be unified here are strings written in (forward)
+||polish notation, such as "*+12-xy" - meaning (1+2)*(x-y). The
+||operators are + - * / with single letter variables, and single digit
+||constants. We provide bindings for the free identifiers of "unify.m"
+||corresponding to this syntax.
+
+%include "unify.m"
+ { expr==[char]; operator==char; var==char;
+ isvar=isvar; getvar=getvar; putvar=putvar;
+ rator=rator; rands=rands; construct=construct;
+ }
+
+isvar e = letter (hd e)
+getvar = hd
+putvar = (:[])
+rator = hd
+rands (c:[]) = [], if digit c
+rands (c:e) = [a,b], if member "+-*/" c & e2=[]
+ = error "illegal string", otherwise
+ where
+ (a,e1) = get e
+ (b,e2) = get e1
+ get [] = error "illegal string"
+ get (c:x) = ([c],x), if letter c \/ digit c
+ = ([c]++a++b,x2), otherwise
+ where
+ (a,x1) = get x
+ (b,x2) = get x1
+construct c xs = c:concat xs
+
+test = unifyexprs "*+x3/7x" "*+1y/z1" ||the result should be "*+13/71"
+test1 = unifyexprs "*+x3/7x" "*+1y/y1" ||not unifiable