From 91bd2bfaa5f95ff988ff36af64f153b608e0c63c Mon Sep 17 00:00:00 2001
From: Michael Leuschel <leuschel@uni-duesseldorf.de>
Date: Wed, 22 Nov 2023 20:43:14 +0100
Subject: [PATCH] add Sieve example

Signed-off-by: Michael Leuschel <leuschel@uni-duesseldorf.de>
---
 Sieve/Sieve_VisB.mch | 46 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 46 insertions(+)
 create mode 100644 Sieve/Sieve_VisB.mch

diff --git a/Sieve/Sieve_VisB.mch b/Sieve/Sieve_VisB.mch
new file mode 100644
index 0000000..30f001a
--- /dev/null
+++ b/Sieve/Sieve_VisB.mch
@@ -0,0 +1,46 @@
+MACHINE Sieve_VisB
+// A version of the Sieve model with a simple VisB visualisation
+DEFINITIONS
+  SET_PREF_MAXINT == 99;
+  SET_PREF_MININT == -1;
+  MINLIM == MAXINT-1;
+  GOAL == (cur=1 & numbers /= {});
+  VISB_SVG_FILE == "";
+  VISB_SVG_BOX == rec(height:220, width:220, viewBox:"0 0 220 220");
+  vsz == 20;
+  VISB_SVG_OBJECTS2 == {x,y•x:0..9 & y:0..9 | rec(`id`:("nr",x,y), svg_class:"text",
+                                                 x:vsz+x*vsz, y:vsz+y*vsz, `font-size`:10,
+                                                 text:x+y*10)};
+  VISB_SVG_OBJECTS1 == {x,y•x:0..9 & y:0..9 | rec(`id`:("rec",x,y), svg_class:"rect",
+                                                 x:15+x*vsz, y:5+y*vsz,
+                                                 stroke:"green", `stroke-width`:1.5,fill:"white",
+                                                 width:vsz-1, height:vsz-1)};
+  VISB_SVG_UPDATES2 == {x,y•x:0..9 & y:0..9 | rec(`id`:("rec",x,y),
+                                                   stroke:IF x+y*10=cur THEN "red"
+                                                          ELSIF x+y*10:numbers THEN "green" ELSE "gray" END,
+                                                   fill: IF x+y*10:numbers THEN "white" ELSE "gray" END)};
+VARIABLES numbers,cur, limit
+INVARIANT
+ numbers <: INTEGER & cur:NATURAL1 & limit:NATURAL1
+INITIALISATION numbers := {} || cur := 1 || limit := 1
+OPERATIONS
+  StartSieve(lim) = PRE cur=1 & lim>MINLIM & lim <= MAXINT THEN
+    numbers := 2..lim ||
+    cur := 2 ||
+    limit := lim
+  END;
+  prime <-- TreatNumber(cc) = PRE cc=cur & cur>1 & cur*cur<= limit THEN
+    IF cc:numbers THEN
+       numbers := numbers - ran(%n.(n:cur..limit/cur|cur*n))
+/*        numbers := numbers - ran(%n.(n:2..limit/cur|cur*n)) */
+      || prime := TRUE
+    ELSE
+       prime := FALSE
+    END ||
+    cur := cur+1
+  END;
+  r <-- Finish = PRE cur*cur>limit THEN
+    cur := 1 || r := card(numbers)
+  END
+END
+
-- 
GitLab