Skip to content

Commit efe8e07

Browse files
committed
Lisa Vesali asendusloengus tehtud asjad (sealhulgas imekaunis copy-paste püsipunkti arvutus)
1 parent 48869a4 commit efe8e07

File tree

1 file changed

+84
-4
lines changed

1 file changed

+84
-4
lines changed

src/abseval/abseval.ml

Lines changed: 84 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,37 @@ struct
1313
Vihje: ID.of_interval.
1414
Vihje: ID.eval_binary. *)
1515
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
1724

1825
(** Väärtustab valvuri (avaldis ja selle oodatav tõeväärtus) keskkonnas.
1926
Kui valvur on keskkonnaga vastuolus, siis tagastab saavutamatu programmi oleku ED.bot.
2027
Kui valvuriga saab keskkonna muutujate väärtusi täpsemaks kitsendada, siis võib keskkonda muuta.
2128
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
2447

2548
module EDFP = Fixpoint.MakeDomain (ED)
2649

@@ -29,5 +52,62 @@ struct
2952
Vihje: eval_guard.
3053
Vihje: While jaoks kasuta püsipunkti moodulit EDFP. *)
3154
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
33113
end

0 commit comments

Comments
 (0)