@@ -13,14 +13,37 @@ struct
13
13
Vihje: ID.of_interval.
14
14
Vihje: ID.eval_binary. *)
15
15
let rec eval_expr (env : ED.t ) (expr : expr ): ID.t =
16
- failwith " TODO"
16
+ match expr with
17
+ | Num i -> ID. of_int i
18
+ | Var x -> ED. find x env
19
+ | Rand (l , u ) -> ID. of_interval (l, u)
20
+ | Binary (l , b , r ) ->
21
+ let li = eval_expr env l in
22
+ let ri = eval_expr env r in
23
+ ID. eval_binary li b ri
17
24
18
25
(* * Väärtustab valvuri (avaldis ja selle oodatav tõeväärtus) keskkonnas.
19
26
Kui valvur on keskkonnaga vastuolus, siis tagastab saavutamatu programmi oleku ED.bot.
20
27
Kui valvuriga saab keskkonna muutujate väärtusi täpsemaks kitsendada, siis võib keskkonda muuta.
21
28
Võib jätta keskkonna muutmata, kuid siis ei kasutata valvurist saadavat lisainfot. *)
22
- let eval_guard (env : ED.t ) (expr : expr ) (branch : bool ): ED.t =
23
- failwith " TODO"
29
+ let rec eval_guard (env : ED.t ) (expr : expr ) (branch : bool ): ED.t =
30
+ let expr_value = eval_expr env expr in
31
+ let zero = ID. of_int 0 in
32
+ if branch && ID. leq expr_value zero ||
33
+ not branch && not (ID. leq zero expr_value) then
34
+ ED. bot
35
+ else
36
+ match expr, branch with
37
+ | Binary (Var x, Eq , Num c), true
38
+ | Binary (Var x , Ne, Num c ), false ->
39
+ ED. add x (ID. of_int c) env
40
+ | Binary (Var x, Eq , Num c), false
41
+ | Binary (Var x , Ne, Num c ), true ->
42
+ let previous = ED. find x env in
43
+ let excluded = ID. exclude c previous in
44
+ ED. add x excluded env
45
+ | Var x , _ -> eval_guard env (Binary (Var x, Ne , Num 0 )) branch
46
+ | _ -> env
24
47
25
48
module EDFP = Fixpoint. MakeDomain (ED )
26
49
@@ -29,5 +52,62 @@ struct
29
52
Vihje: eval_guard.
30
53
Vihje: While jaoks kasuta püsipunkti moodulit EDFP. *)
31
54
let rec eval_stmt (env : ED.t ) (stmt : stmt ): ED.t =
32
- failwith " TODO"
55
+ match stmt with
56
+ | Nop -> env
57
+ | Error -> if ED. leq env ED. bot then ED. bot else failwith " eval_stmt: Error"
58
+ | Assign (x , e ) ->
59
+ ED. add x (eval_expr env e) env
60
+ | Seq (a , b ) ->
61
+ eval_stmt (eval_stmt env a) b
62
+ | If (c , t , f ) ->
63
+ let t_refined_env = eval_guard env c true in
64
+ let t_post_env = eval_stmt t_refined_env t in
65
+ let f_refined_env = eval_guard env c false in
66
+ let f_post_env = eval_stmt f_refined_env f in
67
+ ED. join t_post_env f_post_env
68
+ | While (c , b ) ->
69
+ let b_refined_env = eval_guard env c true in
70
+ let b_post_env = eval_stmt b_refined_env b in
71
+ let while_result = ED. join env b_post_env in
72
+
73
+ let b_refined_env = eval_guard while_result c true in
74
+ let b_post_env = eval_stmt b_refined_env b in
75
+ let while_result = ED. join while_result b_post_env in
76
+ let b_refined_env = eval_guard while_result c true in
77
+ let b_post_env = eval_stmt b_refined_env b in
78
+ let while_result = ED. join while_result b_post_env in
79
+ let b_refined_env = eval_guard while_result c true in
80
+ let b_post_env = eval_stmt b_refined_env b in
81
+ let while_result = ED. join while_result b_post_env in
82
+ let b_refined_env = eval_guard while_result c true in
83
+ let b_post_env = eval_stmt b_refined_env b in
84
+ let while_result = ED. join while_result b_post_env in
85
+ let b_refined_env = eval_guard while_result c true in
86
+ let b_post_env = eval_stmt b_refined_env b in
87
+ let while_result = ED. join while_result b_post_env in
88
+ let b_refined_env = eval_guard while_result c true in
89
+ let b_post_env = eval_stmt b_refined_env b in
90
+ let while_result = ED. join while_result b_post_env in
91
+ let b_refined_env = eval_guard while_result c true in
92
+ let b_post_env = eval_stmt b_refined_env b in
93
+ let while_result = ED. join while_result b_post_env in
94
+ let b_refined_env = eval_guard while_result c true in
95
+ let b_post_env = eval_stmt b_refined_env b in
96
+ let while_result = ED. join while_result b_post_env in
97
+ let b_refined_env = eval_guard while_result c true in
98
+ let b_post_env = eval_stmt b_refined_env b in
99
+ let while_result = ED. join while_result b_post_env in
100
+ let b_refined_env = eval_guard while_result c true in
101
+ let b_post_env = eval_stmt b_refined_env b in
102
+ let while_result = ED. join while_result b_post_env in
103
+ let b_refined_env = eval_guard while_result c true in
104
+ let b_post_env = eval_stmt b_refined_env b in
105
+ let while_result = ED. join while_result b_post_env in
106
+ let b_refined_env = eval_guard while_result c true in
107
+ let b_post_env = eval_stmt b_refined_env b in
108
+ let while_result = ED. join while_result b_post_env in
109
+ let b_refined_env = eval_guard while_result c true in
110
+ let b_post_env = eval_stmt b_refined_env b in
111
+ let while_result = ED. join while_result b_post_env in
112
+ eval_guard while_result c false
33
113
end
0 commit comments