2024-11-13 21:50:44 +01:00
|
|
|
open MiniImp.Semantics
|
|
|
|
|
open MiniImp.Types
|
2024-10-20 20:28:44 +02:00
|
|
|
|
|
|
|
|
(* -------------------------------------------------------------------------- *)
|
|
|
|
|
(* Identity program *)
|
|
|
|
|
let program =
|
|
|
|
|
Main
|
|
|
|
|
("a",
|
|
|
|
|
"b",
|
|
|
|
|
(Assignment ("b", (Variable "a")))
|
|
|
|
|
)
|
|
|
|
|
;;
|
|
|
|
|
|
2024-11-16 15:40:00 +01:00
|
|
|
Printf.printf "Identity program: ";
|
|
|
|
|
match reduce program 1 with
|
|
|
|
|
Ok d -> Printf.printf "%d\n" d
|
|
|
|
|
| Error `AbsentAssignment msg -> Printf.printf "error -> %s\n" msg
|
|
|
|
|
| Error `DivisionByZero msg -> Printf.printf "error -> %s\n" msg
|
|
|
|
|
;;
|
2024-10-20 20:28:44 +02:00
|
|
|
|
|
|
|
|
(* -------------------------------------------------------------------------- *)
|
|
|
|
|
(* y not defined program *)
|
|
|
|
|
let program =
|
|
|
|
|
Main
|
|
|
|
|
("a",
|
|
|
|
|
"b",
|
|
|
|
|
(Sequence (
|
|
|
|
|
(Assignment ("x", (Integer 1))),
|
|
|
|
|
(Assignment ("b",
|
2025-01-26 22:07:53 +01:00
|
|
|
(Plus ((Plus (Variable "a", Variable "x")),
|
|
|
|
|
(Variable "y")))))
|
2024-10-20 20:28:44 +02:00
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
;;
|
|
|
|
|
|
2024-11-16 15:40:00 +01:00
|
|
|
|
|
|
|
|
Printf.printf "y not defined program: ";
|
|
|
|
|
match reduce program 100 with
|
|
|
|
|
Ok d -> Printf.printf "error: %d\n" d
|
|
|
|
|
| Error `AbsentAssignment msg -> Printf.printf "%s\n" msg
|
|
|
|
|
| Error `DivisionByZero msg -> Printf.printf "error -> %s\n" msg
|
2024-10-20 20:28:44 +02:00
|
|
|
;;
|
|
|
|
|
|
|
|
|
|
(* -------------------------------------------------------------------------- *)
|
2024-10-21 17:46:19 +02:00
|
|
|
(* Factorial program *)
|
2024-10-20 20:28:44 +02:00
|
|
|
let program =
|
|
|
|
|
Main
|
|
|
|
|
("a",
|
|
|
|
|
"b",
|
|
|
|
|
(Sequence (
|
|
|
|
|
(Assignment ("b", (Integer 1))),
|
|
|
|
|
(For (
|
|
|
|
|
(Assignment ("i", (Integer 1))),
|
|
|
|
|
(BCmpLessEq (Variable "i", Variable "a")),
|
|
|
|
|
(Assignment ("i", (Plus ((Variable "i"), (Integer 1))))),
|
|
|
|
|
(Assignment ("b", (Times (Variable "b", Variable "i"))))
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
;;
|
|
|
|
|
|
2024-11-16 15:40:00 +01:00
|
|
|
Printf.printf "Factorial program: ";
|
|
|
|
|
match reduce program 10 with
|
|
|
|
|
Ok d -> Printf.printf "%d\n" d
|
|
|
|
|
| Error `AbsentAssignment msg -> Printf.printf "error -> %s\n" msg
|
|
|
|
|
| Error `DivisionByZero msg -> Printf.printf "error -> %s\n" msg
|
2024-10-20 20:28:44 +02:00
|
|
|
;;
|
|
|
|
|
|
2024-11-16 15:40:00 +01:00
|
|
|
|
2024-10-20 20:28:44 +02:00
|
|
|
(* -------------------------------------------------------------------------- *)
|
2024-10-21 17:46:19 +02:00
|
|
|
(* Hailstone sequence's lenght program *)
|
2024-10-20 20:28:44 +02:00
|
|
|
let program =
|
|
|
|
|
Main
|
|
|
|
|
("a",
|
|
|
|
|
"b",
|
|
|
|
|
(Sequence (
|
|
|
|
|
(Assignment ("b", (Integer 1))),
|
|
|
|
|
(While (
|
|
|
|
|
(BNot (BCmp ((Variable "a"), (Integer 1)))),
|
|
|
|
|
(Sequence (
|
|
|
|
|
(Assignment ("b", (Plus (Variable "b", Integer 1)))),
|
|
|
|
|
(If (
|
|
|
|
|
(BCmp (Modulo (Variable "a", Integer 2), Integer 1)),
|
2025-01-26 22:07:53 +01:00
|
|
|
(Assignment ("a", Plus (Times (Integer 3, Variable "a"),
|
|
|
|
|
Integer 1))),
|
2024-10-20 20:28:44 +02:00
|
|
|
(Assignment ("a", Division (Variable "a", Integer 2)))
|
|
|
|
|
))
|
|
|
|
|
))
|
|
|
|
|
))
|
|
|
|
|
))
|
|
|
|
|
)
|
|
|
|
|
;;
|
|
|
|
|
|
2024-11-16 15:40:00 +01:00
|
|
|
Printf.printf "Hailstone sequence's lenght program: ";
|
|
|
|
|
match reduce program 77031 with
|
|
|
|
|
Ok d -> Printf.printf "%d\n" d
|
|
|
|
|
| Error `AbsentAssignment msg -> Printf.printf "error -> %s\n" msg
|
|
|
|
|
| Error `DivisionByZero msg -> Printf.printf "error -> %s\n" msg
|
2024-10-20 20:28:44 +02:00
|
|
|
;;
|
|
|
|
|
|
|
|
|
|
(* -------------------------------------------------------------------------- *)
|
2024-10-21 17:46:19 +02:00
|
|
|
(* Sum multiples of 3 and 5 program *)
|
2024-10-20 20:28:44 +02:00
|
|
|
let program =
|
|
|
|
|
Main
|
|
|
|
|
("a",
|
|
|
|
|
"b",
|
|
|
|
|
(Sequence (
|
|
|
|
|
(Assignment ("b", (Integer 0))),
|
|
|
|
|
(For (
|
|
|
|
|
(Assignment ("i", Integer 0)),
|
2024-10-21 17:46:19 +02:00
|
|
|
(BCmpLessEq (Variable "i", Variable "a")),
|
2024-10-20 20:28:44 +02:00
|
|
|
(Assignment ("i", Plus (Variable "i", Integer 1))),
|
|
|
|
|
(If (
|
|
|
|
|
(BOr ((BCmp (Modulo (Variable "i", Integer 3), Integer 0)),
|
|
|
|
|
(BCmp (Modulo (Variable "i", Integer 5), Integer 0)))),
|
|
|
|
|
(Assignment ("b", Plus (Variable "b", Variable "i"))),
|
|
|
|
|
(Skip)
|
|
|
|
|
))
|
|
|
|
|
))
|
|
|
|
|
))
|
|
|
|
|
)
|
|
|
|
|
;;
|
|
|
|
|
|
2024-11-16 15:40:00 +01:00
|
|
|
Printf.printf "Sum multiples of 3 and 5 program: ";
|
|
|
|
|
match reduce program 12345 with
|
|
|
|
|
Ok d -> Printf.printf "%d\n" d
|
|
|
|
|
| Error `AbsentAssignment msg -> Printf.printf "error -> %s\n" msg
|
|
|
|
|
| Error `DivisionByZero msg -> Printf.printf "error -> %s\n" msg
|
2024-10-20 20:28:44 +02:00
|
|
|
;;
|
|
|
|
|
|
|
|
|
|
(* -------------------------------------------------------------------------- *)
|
2024-10-21 17:46:19 +02:00
|
|
|
(* Rand program *)
|
2024-10-20 20:28:44 +02:00
|
|
|
let program =
|
|
|
|
|
Main
|
|
|
|
|
("a",
|
|
|
|
|
"b",
|
|
|
|
|
(Assignment ("b", Rand (Variable "a")))
|
|
|
|
|
)
|
|
|
|
|
;;
|
|
|
|
|
|
2024-11-16 15:40:00 +01:00
|
|
|
Printf.printf "Rand program: ";
|
|
|
|
|
match reduce program 10 with
|
|
|
|
|
Ok d -> Printf.printf "%b\n" (d < 10)
|
|
|
|
|
| Error `AbsentAssignment msg -> Printf.printf "error -> %s\n" msg
|
|
|
|
|
| Error `DivisionByZero msg -> Printf.printf "error -> %s\n" msg
|
2024-10-20 20:28:44 +02:00
|
|
|
;;
|
|
|
|
|
|
|
|
|
|
(* -------------------------------------------------------------------------- *)
|
2024-10-21 17:46:19 +02:00
|
|
|
(* Fibonacci program *)
|
2024-10-20 20:28:44 +02:00
|
|
|
let program =
|
|
|
|
|
Main
|
|
|
|
|
("n",
|
|
|
|
|
"fnext",
|
|
|
|
|
(Sequence (
|
|
|
|
|
Sequence (
|
|
|
|
|
(Assignment ("fnow", Integer 0)),
|
|
|
|
|
(Assignment ("fnext", Integer 1))
|
|
|
|
|
),
|
|
|
|
|
(While (
|
|
|
|
|
(BCmpGreater (Variable "n", Integer 1)),
|
|
|
|
|
(Sequence (
|
|
|
|
|
(Sequence (
|
2025-01-26 22:07:53 +01:00
|
|
|
(Assignment ("tmp", Plus (Variable "fnow",
|
|
|
|
|
Variable "fnext"))),
|
2024-10-20 20:28:44 +02:00
|
|
|
(Assignment ("fnow", Variable "fnext"))
|
|
|
|
|
)),
|
|
|
|
|
(Sequence (
|
|
|
|
|
(Assignment ("fnext", Variable "tmp")),
|
|
|
|
|
(Assignment ("n", Minus (Variable "n", Integer 1)))
|
|
|
|
|
))
|
|
|
|
|
))))
|
|
|
|
|
))
|
|
|
|
|
)
|
|
|
|
|
;;
|
|
|
|
|
|
2024-11-16 15:40:00 +01:00
|
|
|
Printf.printf "Fibonacci program: ";
|
|
|
|
|
match reduce program 48 with
|
|
|
|
|
Ok d -> Printf.printf "%d\n" d
|
|
|
|
|
| Error `AbsentAssignment msg -> Printf.printf "error -> %s\n" msg
|
|
|
|
|
| Error `DivisionByZero msg -> Printf.printf "error -> %s\n" msg
|
2024-10-20 20:28:44 +02:00
|
|
|
;;
|
|
|
|
|
|
|
|
|
|
(* -------------------------------------------------------------------------- *)
|
|
|
|
|
(* Miller-Rabin primality test program *)
|
|
|
|
|
let program =
|
|
|
|
|
Main
|
|
|
|
|
("n",
|
|
|
|
|
"result",
|
|
|
|
|
Sequence (
|
|
|
|
|
(Assignment ("result", Integer 0)),
|
|
|
|
|
(Sequence (
|
|
|
|
|
(Sequence (
|
|
|
|
|
(Assignment ("s", Integer 0)),
|
|
|
|
|
(While (
|
|
|
|
|
(BCmp (Integer 0,
|
|
|
|
|
Modulo (
|
|
|
|
|
Division (
|
|
|
|
|
(Minus (Variable "n", Integer 1)),
|
|
|
|
|
(Power (Integer 2, Variable "s"))),
|
|
|
|
|
(Integer 2)
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
),
|
|
|
|
|
(Assignment ("s", Plus (Variable "s", Integer 1)))
|
|
|
|
|
))
|
|
|
|
|
)),
|
|
|
|
|
(Sequence (
|
2025-01-26 22:07:53 +01:00
|
|
|
(Assignment ("d", Division (Minus (Variable "n", Integer 1),
|
|
|
|
|
Power (Integer 2, Variable "s")))),
|
2024-10-20 20:28:44 +02:00
|
|
|
(For (
|
|
|
|
|
(Assignment ("i", Integer 20)),
|
|
|
|
|
(BCmpGreater (Variable "i", Integer 0)),
|
|
|
|
|
(Assignment ("i", Minus (Variable "i", Integer 1))),
|
|
|
|
|
(Sequence (
|
|
|
|
|
Sequence (
|
2025-01-26 22:07:53 +01:00
|
|
|
(Assignment
|
|
|
|
|
("a",
|
|
|
|
|
Plus (Rand (Minus (Variable "n", Integer 4)),
|
|
|
|
|
Integer 2))),
|
|
|
|
|
(Assignment ("x", PowerMod (Variable "a",
|
|
|
|
|
Variable "d",
|
|
|
|
|
Variable "n")))),
|
2024-10-20 20:28:44 +02:00
|
|
|
Sequence (
|
|
|
|
|
(For (
|
|
|
|
|
(Assignment ("j", Integer 0)),
|
|
|
|
|
(BCmpLess (Variable "j", Variable "s")),
|
|
|
|
|
(Assignment ("j", Plus (Variable "j", Integer 1))),
|
|
|
|
|
(Sequence (
|
|
|
|
|
Sequence (
|
2025-01-26 22:07:53 +01:00
|
|
|
(Assignment ("y", PowerMod (Variable "x",
|
|
|
|
|
Integer 2,
|
|
|
|
|
Variable "n"))),
|
2024-10-20 20:28:44 +02:00
|
|
|
(If (
|
2025-01-26 22:07:53 +01:00
|
|
|
(BAnd
|
|
|
|
|
(BAnd (BCmp (Variable "y", Integer 1),
|
|
|
|
|
BNot (BCmp (Variable "x",
|
|
|
|
|
Integer 1))),
|
|
|
|
|
BNot (BCmp (Variable "x",
|
|
|
|
|
Minus (Variable "n",
|
|
|
|
|
Integer 1))))),
|
2024-10-20 20:28:44 +02:00
|
|
|
(Assignment ("result", Integer 1)),
|
|
|
|
|
(Skip)
|
|
|
|
|
))),
|
|
|
|
|
(Assignment ("x", Variable "y"))
|
|
|
|
|
))
|
|
|
|
|
)),
|
|
|
|
|
(If (
|
|
|
|
|
(BNot (BCmp (Variable "y", Integer 1))),
|
|
|
|
|
(Assignment ("result", Integer 1)),
|
|
|
|
|
(Skip)
|
|
|
|
|
)))
|
|
|
|
|
))
|
|
|
|
|
))
|
|
|
|
|
))
|
|
|
|
|
))
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
;;
|
|
|
|
|
|
|
|
|
|
(* should return 0 because prime *)
|
2024-11-16 15:40:00 +01:00
|
|
|
Printf.printf "Miller-Rabin primality test program 1: ";
|
|
|
|
|
match reduce program 179424673 with
|
|
|
|
|
Ok d -> Printf.printf "%d\n" d
|
|
|
|
|
| Error `AbsentAssignment msg -> Printf.printf "error -> %s\n" msg
|
|
|
|
|
| Error `DivisionByZero msg -> Printf.printf "error -> %s\n" msg
|
2024-10-20 20:28:44 +02:00
|
|
|
;;
|
2024-10-21 17:46:19 +02:00
|
|
|
(* should return 1 because not prime *)
|
2024-11-16 15:40:00 +01:00
|
|
|
Printf.printf "Miller-Rabin primality test program 2: ";
|
|
|
|
|
match reduce program 179424675 with
|
|
|
|
|
Ok d -> Printf.printf "%d\n" d
|
|
|
|
|
| Error `AbsentAssignment msg -> Printf.printf "error -> %s\n" msg
|
|
|
|
|
| Error `DivisionByZero msg -> Printf.printf "error -> %s\n" msg
|
2024-10-20 20:28:44 +02:00
|
|
|
;;
|