Skip to content

Commit 1bfa193

Browse files
committed
Lahenda toylangs praktikumis
1 parent 248a06f commit 1bfa193

4 files changed

Lines changed: 70 additions & 7 deletions

File tree

src/toylangs/bool.ml

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,25 @@ type env = CharSet.t
1313

1414

1515
(** Vihje: Kasuta Crashcourse.Basics.implies funktsiooni. *)
16-
let rec eval (env: env) (e: t): bool =
17-
failwith "TODO"
16+
(* let rec eval (env: env) (e: t): bool =
17+
match e with
18+
| Var x -> CharSet.mem x env
19+
| Not e -> not (eval env e)
20+
| Or (e1, e2) -> eval env e1 || eval env e2
21+
| Imp (e1, e2) -> Crashcourse.Basics.implies (eval env e1) (eval env e2) *)
22+
(* let rec eval (env: env) (e: t): bool =
23+
let eval' = eval env in
24+
match e with
25+
| Var x -> CharSet.mem x env
26+
| Not e -> not (eval' e)
27+
| Or (e1, e2) -> eval' e1 || eval' e2
28+
| Imp (e1, e2) -> Crashcourse.Basics.implies (eval' e1) (eval' e2) *)
29+
let eval (env: env) (e: t): bool =
30+
let rec eval' e =
31+
match e with
32+
| Var x -> CharSet.mem x env
33+
| Not e -> not (eval' e)
34+
| Or (e1, e2) -> eval' e1 || eval' e2
35+
| Imp (e1, e2) -> Crashcourse.Basics.implies (eval' e1) (eval' e2)
36+
in
37+
eval' e

src/toylangs/expr.ml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,8 @@ type t =
99

1010

1111
let rec eval (e: t): int =
12-
failwith "TODO"
12+
match e with
13+
| Num i -> i
14+
| Neg e -> -(eval e)
15+
| Add (e1, e2) -> eval e1 + eval e2
16+
| Div (e1, e2) -> eval e1 / eval e2

src/toylangs/imp.ml

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,29 @@ type assign = char * expr
1515
(** Programm. *)
1616
type prog = assign list * expr
1717

18+
(** Väärtuskeskkond. *)
19+
module Env = Map.Make (Char)
20+
type env = int Env.t
1821

22+
let rec eval_expr (env: env) (e: expr): int =
23+
match e with
24+
| Num i -> i
25+
| Var x -> Env.find x env
26+
| Neg e -> -(eval_expr env e)
27+
| Add (e1, e2) -> eval_expr env e1 + eval_expr env e2
28+
| Div (e1, e2) -> eval_expr env e1 / eval_expr env e2
29+
30+
let eval_assign (env: env) ((x, e): assign): env =
31+
let i = eval_expr env e in
32+
Env.add x i env
1933

2034
(** Väärtustab programmi koos omistamistega.
2135
Vihje: Kirjuta abifunktsioonid avaldiste ja omistamiste väärtustamiseks.
2236
Vihje: List.fold_left. *)
2337
let eval_prog ((assigns, expr): prog): int =
24-
failwith "TODO"
38+
(* let env = List.fold_left (fun acc assign ->
39+
eval_assign acc assign
40+
) Env.empty assigns
41+
in *)
42+
let env = List.fold_left eval_assign Env.empty assigns in
43+
eval_expr env expr

src/toylangs/rnd.ml

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,16 @@ type coin = unit -> bool
1414
(** Väärtustab avaldise etteantud mündiga.
1515
NB! Väärtustamise järjekord on oluline. *)
1616
let rec eval (coin: coin) (e: t): int =
17-
failwith "TODO"
17+
match e with
18+
| Num i -> i
19+
| Neg e -> -(eval coin e)
20+
(* | Add (e1, e2) -> eval coin e2 + eval coin e1 *)
21+
| Add (e1, e2) ->
22+
let i1 = eval coin e1 in
23+
let i2 = eval coin e2 in
24+
i1 + i2
25+
(* | Flip (e1, e2) -> if coin () then eval coin e1 else eval coin e2 *)
26+
| Flip (e1, e2) -> eval coin (if coin () then e1 else e2)
1827

1928

2029
(** Konstrueerib kahe listi otsekorrutise. *)
@@ -31,7 +40,13 @@ let cartesian_map (f: 'a -> 'b -> 'c) (l1: 'a list) (l2: 'b list): 'c list =
3140
Vihje: List.map.
3241
Vihje: cartesian_product või cartesian_map. *)
3342
let rec eval_list (e: t): int list =
34-
failwith "TODO"
43+
match e with
44+
| Num i -> [i]
45+
| Neg e -> List.map (fun x -> -x) (eval_list e)
46+
(* | Add (e1, e2) -> List.map (fun (x, y) -> x + y) (cartesian_product (eval_list e1) (eval_list e2)) *)
47+
(* | Add (e1, e2) -> cartesian_map (fun x y -> x + y) (eval_list e1) (eval_list e2) *)
48+
| Add (e1, e2) -> cartesian_map (+) (eval_list e1) (eval_list e2)
49+
| Flip (e1, e2) -> eval_list e1 @ eval_list e2
3550

3651

3752
module IntSet =
@@ -53,4 +68,9 @@ end
5368
Vihje: IntSet.map.
5469
Vihje: IntSet.cartesian_map. *)
5570
let rec eval_set (e: t): IntSet.t =
56-
failwith "TODO"
71+
(* IntSet.of_list (eval_list e) *)
72+
match e with
73+
| Num i -> IntSet.singleton i
74+
| Neg e -> IntSet.map (fun x -> -x) (eval_set e)
75+
| Add (e1, e2) -> IntSet.cartesian_map (+) (eval_set e1) (eval_set e2)
76+
| Flip (e1, e2) -> IntSet.union (eval_set e1) (eval_set e2)

0 commit comments

Comments
 (0)