Skip to content

Commit 77a3001

Browse files
committed
Lahenda toylangs praktikumis
1 parent 984b973 commit 77a3001

File tree

4 files changed

+69
-7
lines changed

4 files changed

+69
-7
lines changed

src/toylangs/bool.ml

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,18 @@ 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 eval (env: env) (e: t): bool =
17+
(* let eval' = eval env in
18+
match e with
19+
| Var x -> CharSet.mem x env
20+
| Not e -> not (eval' e)
21+
| Or (e1, e2) -> eval' e1 || eval' e2
22+
| Imp (e1, e2) -> Crashcourse.Basics.implies (eval' e1) (eval' e2) *)
23+
let rec eval' e =
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+
in
30+
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: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,28 @@ type assign = char * expr
1515
(** Programm. *)
1616
type prog = assign list * expr
1717

18+
module Env = Map.Make (Char)
19+
type env = int Env.t
1820

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

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

src/toylangs/rnd.ml

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,21 @@ 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) ->
26+
(* if coin () then
27+
eval coin e1
28+
else
29+
eval coin e2 *)
30+
let e' = if coin () then e1 else e2 in
31+
eval coin e'
1832

1933

2034
(** Konstrueerib kahe listi otsekorrutise. *)
@@ -26,7 +40,12 @@ let cartesian_product (l1: 'a list) (l2: 'b list): ('a * 'b) list =
2640
Vihje: List.map.
2741
Vihje: cartesian_product. *)
2842
let rec eval_list (e: t): int list =
29-
failwith "TODO"
43+
match e with
44+
| Num i -> [i]
45+
| Neg e -> List.map (fun x -> -x) (eval_list e)
46+
| Flip (e1, e2) -> eval_list e1 @ eval_list e2
47+
| Add (e1, e2) ->
48+
List.map (fun (x, y) -> x + y) (cartesian_product (eval_list e1) (eval_list e2))
3049

3150

3251
module IntSet = Set.Make (Int)
@@ -39,4 +58,12 @@ module IntSet = Set.Make (Int)
3958
2. teostada otsekorrutisega operatsioon listidel (cartesian_product),
4059
3. teisendada list hulgaks (IntSet.of_list). *)
4160
let rec eval_set (e: t): IntSet.t =
42-
failwith "TODO"
61+
(* IntSet.of_list (eval_list e) *)
62+
match e with
63+
| Num i -> IntSet.singleton i
64+
| Neg e -> IntSet.map (fun x -> -x) (eval_set e)
65+
| Flip (e1, e2) -> IntSet.union (eval_set e1) (eval_set e2)
66+
| Add (e1, e2) ->
67+
let l1 = IntSet.elements (eval_set e1) in
68+
let l2 = IntSet.elements (eval_set e2) in
69+
IntSet.of_list (List.map (fun (x, y) -> x + y) (cartesian_product l1 l2))

0 commit comments

Comments
 (0)