aboutsummaryrefslogtreecommitdiff
path: root/sample/reduce.in
diff options
context:
space:
mode:
authorShinya Sato <shinnya.sato@gmail.com>2022-12-29 23:37:35 +0900
committerShinya Sato <shinnya.sato@gmail.com>2022-12-29 23:37:35 +0900
commit984328ee471ecc8e2689348a7d60ef2bed18159c (patch)
tree547f6a2e5946fa2d699b4ec945661a7ab0fb6932 /sample/reduce.in
parent47000121994e8f10a3b89691856d99e917e7226d (diff)
downloadinpla-984328ee471ecc8e2689348a7d60ef2bed18159c.tar.gz
inpla-984328ee471ecc8e2689348a7d60ef2bed18159c.zip
v10.0.2
Diffstat (limited to 'sample/reduce.in')
-rw-r--r--sample/reduce.in57
1 files changed, 57 insertions, 0 deletions
diff --git a/sample/reduce.in b/sample/reduce.in
new file mode 100644
index 0000000..90ba145
--- /dev/null
+++ b/sample/reduce.in
@@ -0,0 +1,57 @@
+// foldr, foldl functions
+
+
+// target functions
+// Here, we use built-in agents Add and Sub
+
+
+// --------------------------------------------------------------------
+// foldr f v [x0, x1, ..., xn] = f(x0, f(x1, ... f(xn-1, f(xn, v))...))
+// --------------------------------------------------------------------
+foldr(r, f, v) >< x:xs => foldr_Cons(r,f,v,x)~xs;
+foldr_Cons(r,f,v,x) >< [] => f~((r,x),v);
+foldr_Cons(r,f,v,x) >< y:ys =>
+ Dup(f1,f2)~f,
+ foldr(w, f2, v)~y:ys,
+ f1~((r,x),w);
+
+// --------------------------------------------------------------------
+// foldl f v [x0, x1, ..., xn] = f( ... f(f(v,x0),x1) ..., xn)
+// --------------------------------------------------------------------
+foldl(r, f, v) >< x:xs => foldl_Cons(r,f,v,x)~xs;
+foldl_Cons(r,f,v,x) >< [] => f~((r,v),x);
+foldl_Cons(r,f,v,x) >< y:ys =>
+ Dup(f1,f2)~f,
+ f1~((w,v),x),
+ foldl(r, f2, w)~y:ys;
+
+
+
+
+// ---------- main ----------
+
+// foldr f v [x0, x1, ..., xn] = f(x0, f(x1, ... f(xn-1, f(xn, v))...))
+// foldr plus 10 [1,2,3] = plus(1, plus(2, plus(3, 10))) = 16
+
+foldr(r, %Add, 10) ~ [1,2,3];
+r; free r; // r ->16
+
+
+// foldr subt 1 [30,20,10] = subt(30, subt(20, subt(10, 1)))
+// = 30-(20-(10-1)) = 30-(20-9) = 30-11 = 19
+
+foldr(r, %Sub, 1) ~ [30,20,10];
+r; free r; // r ->19
+
+
+
+// foldl f v [x0, x1, ..., xn] = f( ... f(f(v,x0),x1) ..., xn)
+// foldl plus 10 [1,2,3] = plus(3, plus(2, plus(1, 10))) = 16
+
+foldl(r, %Add, 10) ~ [1,2,3];
+r; free r; // r ->16
+
+
+// foldl subt 10 [1,2,3] = subt(subt(subt(10,1),2),3) = ((10-1)-2)-3 = 4
+foldl(r, %Sub, 10) ~ [1,2,3];
+r; free r; // r ->4