open MiniImp let get_result x = Lexing.from_string x |> Parser.prg Lexer.lex |> Semantics.reduce (* -------------------------------------------------------------------------- *) (* Identity program *) let program = "main a b {b := a}" ;; Printf.printf "Identity program: %d\n" (get_result program 1);; (* -------------------------------------------------------------------------- *) (* y not defined program *) let program = "main a b {x := 1; b := a + x + y}" ;; try Printf.printf "y not defined program: %d\n" (get_result program 100) with Types.AbsentAssignment s -> Printf.printf "y not defined program: %s\n" s ;; (* -------------------------------------------------------------------------- *) (* Factorial program *) let program = "main a b { b := 1; for (i := 1, i <= a, i := i + 1) do { b := b * i; } } " ;; Printf.printf "Factorial program: %d\n" (get_result program 10) ;; (* -------------------------------------------------------------------------- *) (* Hailstone sequence's lenght program *) let program = "main a b { b := 1; while (not a == 1) do { b := b + 1; if ((a % 2) == 1) a := 3 * a + 1 else a := a / 2 } }" ;; Printf.printf "Hailstone sequence's lenght program: %d\n" (get_result program 77031) ;; (* -------------------------------------------------------------------------- *) (* Sum multiples of 3 and 5 program *) let program = "main a b { b := 0; for (i := 0, i <= a, i := i+1) do { if ( i % 3 == 0 || i % 5 == 0) {b := b + i} else {skip} } }" ;; Printf.printf "Sum multiples of 3 and 5 program: %d\n" (get_result program 12345) ;; (* -------------------------------------------------------------------------- *) (* Rand program *) let program = "main a b {b := rand(a)}" ;; Printf.printf "Rand program: %b\n" ((get_result program 10) < 10) ;; (* -------------------------------------------------------------------------- *) (* Fibonacci program *) let program = "main n fnext { fnow := 0; fnext := 1; while (n > 1) do { tmp := fnow + fnext; fnow := fnext; fnext := tmp; n := n - 1 } }" ;; Printf.printf "Fibonacci program: %d\n" (get_result program 48) ;; (* -------------------------------------------------------------------------- *) (* Miller-Rabin primality test program *) let program = "main n result { result := 0; s := 0; while (0 == ((n - 1) / (2 ^ s)) % 2) do { s := s + 1 }; d := ((n - 1) / 2 ^ s); for (i := 20, i > 0, i := i - 1) do { a := rand(n - 4) + 2; x := powmod(a, d, n); for (j := 0, j < s, j := j+1) do { y := powmod(x, 2, n); if (y == 1 && (not x == 1) && (not x == n - 1)) {result := 1} else {skip}; x := y }; if (not y == 1) {result := 1} else {skip} } }" ;; (* should return 0 because prime *) Printf.printf "Miller-Rabin primality test program: %d\n" (get_result program 179424673) ;; (* should return 1 because not prime *) Printf.printf "Miller-Rabin primality test program: %d\n" (get_result program 179424675) ;;