Skip to content

Commit f5b7837

Browse files
committed
Merge branch 'master' into labs
2 parents 1bfa193 + 4efb278 commit f5b7837

16 files changed

Lines changed: 1073 additions & 0 deletions

File tree

src/abseval/abseval.ml

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
(** Abstraktne väärtustaja ehk abstraktne interpretaator. *)
2+
open Ast
3+
4+
(** Abstraktseid väärtustajaid saab luua kasutades erinevaid täisarve abstraheerivaid domeene.
5+
Vt. IntDomain. *)
6+
module Make (ID: IntDomain.S) =
7+
struct
8+
(** Väärtuskeskkonna domeen kasutades antud täisarvude domeeni. *)
9+
module ED = EnvDomain.Make (ID)
10+
11+
(** Väärtustab avaldise keskkonnas.
12+
Vihje: ID.of_int.
13+
Vihje: ID.of_interval.
14+
Vihje: ID.eval_binary. *)
15+
let rec eval_expr (env: ED.t) (expr: expr): ID.t =
16+
failwith "TODO"
17+
18+
(** Väärtustab valvuri (avaldis ja selle oodatav tõeväärtus) keskkonnas.
19+
Kui valvur on keskkonnaga vastuolus, siis tagastab saavutamatu programmi oleku ED.bot.
20+
Kui valvuriga saab keskkonna muutujate väärtusi täpsemaks kitsendada, siis võib keskkonda muuta.
21+
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"
24+
25+
module EDFP = Fixpoint.MakeDomain (ED)
26+
27+
(** Väärtustab lause keskkonnas.
28+
Vihje: Vea jaoks kasuta failwith funktsiooni.
29+
Vihje: eval_guard.
30+
Vihje: While jaoks kasuta püsipunkti moodulit EDFP. *)
31+
let rec eval_stmt (env: ED.t) (stmt: stmt): ED.t =
32+
failwith "TODO"
33+
end

src/abseval/dune

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
(library
2+
(name abseval)
3+
(libraries ast domain fixpoint))

src/domain/domain.ml

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
(** Domeenid. *)
2+
3+
(** Poolvõre. *)
4+
module type Semilattice =
5+
sig
6+
type t [@@deriving eq, ord, show]
7+
8+
(** Osaline järjestus.
9+
10+
Relatsioon, mis on:
11+
1. refleksiivne,
12+
2. antisümmeetriline,
13+
3. transitiivne. *)
14+
val leq: t -> t -> bool
15+
16+
(** Ülemraja operatsioon.
17+
18+
Leiab elemendi, mis on mõlemast antud elemendist suurem (leq järgi)
19+
ja on vähim selline element (leq järgi). *)
20+
val join: t -> t -> t
21+
end
22+
23+
(** Tõkestatud poolvõre. *)
24+
module type BoundedSemilattice =
25+
sig
26+
include Semilattice
27+
28+
(** Vähim element (leq järgi). *)
29+
val bot: t
30+
end
31+
32+
(** Meie domeen on tõkestatud poolvõre. *)
33+
module type S = BoundedSemilattice
34+
35+
36+
(** Lisab poolvõrele tehisliku vähima elemendi,
37+
et saada tõkestatud poolvõre. *)
38+
module LiftBot (D: Semilattice) =
39+
struct
40+
type t =
41+
| Lift of D.t
42+
| Bot
43+
[@@deriving eq, ord]
44+
45+
let pp ppf = function
46+
| Bot -> Format.pp_print_string ppf ""
47+
| Lift x -> Format.fprintf ppf "Lift %a" D.pp x
48+
49+
let show = Format.asprintf "%a" pp
50+
51+
let bot = Bot
52+
let leq x1 x2 =
53+
match x1, x2 with
54+
| Bot, _ -> true
55+
| Lift _, Bot -> false
56+
| Lift d1, Lift d2 -> D.leq d1 d2
57+
let join x1 x2 =
58+
match x1, x2 with
59+
| Bot, x
60+
| x, Bot -> x
61+
| Lift d1, Lift d2 -> Lift (D.join d1 d2)
62+
end
63+
64+
(** Moodustab võrreldamatutest elementidest "lameda" võre,
65+
lisades tehislikud vähima ja suurima elemendi. *)
66+
module Flat (E: sig type t [@@deriving eq, ord, show] end) =
67+
struct
68+
type t =
69+
| Top
70+
| Lift of E.t
71+
| Bot
72+
[@@deriving eq, ord]
73+
74+
let pp ppf = function
75+
| Bot -> Format.pp_print_string ppf ""
76+
| Lift x -> Format.fprintf ppf "Lift %a" E.pp x
77+
| Top -> Format.pp_print_string ppf ""
78+
79+
let show = Format.asprintf "%a" pp
80+
81+
let bot = Bot
82+
let leq x1 x2 =
83+
match x1, x2 with
84+
| Bot, _ -> true
85+
| Lift _, Bot -> false
86+
| Lift d1, Lift d2 -> E.equal d1 d2
87+
| _, Top -> true
88+
| Top, _ -> false
89+
let join x1 x2 =
90+
match x1, x2 with
91+
| Bot, x
92+
| x, Bot -> x
93+
| Lift d1, Lift d2 when E.equal d1 d2 -> Lift d1
94+
| Lift _, Lift _ -> Top
95+
| Top, _
96+
| _, Top -> Top
97+
end

src/domain/dune

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
(library
2+
(name domain)
3+
(wrapped false)
4+
(libraries ast eval)
5+
(preprocess (pps ppx_deriving.std)))

src/domain/envDomain.ml

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
(** Väärtuskeskkonna domeen.
2+
Muutujate nimed on sõned ja väärtused mingist domeenist. *)
3+
module Make (D: Domain.S) =
4+
struct
5+
module M = MapDomain.Make (struct type t = string [@@deriving ord, show] end) (D)
6+
(* Lisame tehisliku vähima elemendi (kuigi kujutustel on juba olemas),
7+
millega tähistame saavutamatut programmi olekut. *)
8+
include Domain.LiftBot (M)
9+
10+
(* Mõned keskkondade/kujutuste operatsioonid. *)
11+
12+
let find x d =
13+
match d with
14+
| Bot -> D.bot
15+
| Lift m -> M.find x m
16+
let add x v d =
17+
match d with
18+
| Bot -> Bot
19+
| Lift m -> Lift (M.add x v m)
20+
let empty = Lift M.empty
21+
let singleton x v = Lift (M.singleton x v)
22+
let of_list l = Lift (M.of_list l)
23+
end

src/domain/intDomain.ml

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
(** Täisarvude abstraheerimise domeenid. *)
2+
3+
(** Täisarvude domeeni liides. *)
4+
module type S =
5+
sig
6+
include Domain.S
7+
8+
(** Loob konkreetsele täisarvule vastava elemendi. *)
9+
val of_int: int -> t
10+
11+
(** Loob intervallist juhuarvule vastava elemendi. *)
12+
val of_interval: int * int -> t
13+
14+
(** Väärtustab binaarse operaatori. *)
15+
val eval_binary: t -> Ast.binary -> t -> t
16+
17+
(** Välistab konkreetse täisarvu. *)
18+
val exclude: int -> t -> t
19+
end
20+
21+
(** Täisarvude hulkade domeen. *)
22+
module Set =
23+
struct
24+
include SetDomain.Make (struct type t = int [@@deriving ord, show] end)
25+
let of_int i = singleton i
26+
let of_interval (l, u) = S.of_list (List.init (u - l + 1) (fun i -> l + i))
27+
28+
(** Rakendab binaarset operaatorit kõikvõimalikele paaridele. *)
29+
let eval_binary s1 b s2 =
30+
fold (fun i1 acc ->
31+
fold (fun i2 acc ->
32+
add (Eval.Concrete.eval_binary i1 b i2) acc
33+
) s2 acc
34+
) s1 empty
35+
36+
let exclude i s = remove i s
37+
end
38+
39+
(** Konstantide domeen.
40+
"Lame" täisarvude võre, mis võimaldab esitada konkreetseid täisarve,
41+
kuid mitte-konstandid on täiesti tundmatud. *)
42+
module Flat =
43+
struct
44+
include Domain.Flat (struct type t = int [@@deriving eq, ord, show] end)
45+
let of_int i = Lift i
46+
let of_interval ((l, u): int * int): t =
47+
failwith "TODO"
48+
49+
(** Vihje: Eval.Concrete.eval_binary. *)
50+
let eval_binary (i1: t) (b: Ast.binary) (i2: t): t =
51+
failwith "TODO"
52+
53+
let exclude (i: int) (i': t): t =
54+
failwith "TODO"
55+
end
56+
57+
(** Intervallide domeen. *)
58+
module Interval =
59+
struct
60+
module Interval =
61+
struct
62+
type t = int * int [@@deriving eq, ord]
63+
64+
let pp ppf (l, u) = Format.fprintf ppf "[%d, %d]" l u
65+
let show = Format.asprintf "%a" pp
66+
67+
let leq ((l1, u1): t) ((l2, u2): t): bool =
68+
failwith "TODO"
69+
70+
let join ((l1, u1): t) ((l2, u2): t): t =
71+
failwith "TODO"
72+
73+
let eval_binary ((l1, u1): t) (b: Ast.binary) ((l2, u2): t): t =
74+
match b with
75+
76+
| Eq | Ne | Lt | Le | Gt | Ge -> (0, 1) (* Võrdluse tulemus on 0 või 1, mis on korrektne, aga mitte täpne. Ettepoole saab implementeerida täpsemad juhud kui vaja. *)
77+
78+
| _ -> failwith "TODO" (* Ei pea implementeerima kõiki operaatoreid, vaid ainult testideks vajalikud. *)
79+
end
80+
(* Lisame tehisliku vähima elemendi,
81+
millega tähistame võimatut täisarvulist väärtust. *)
82+
include Domain.LiftBot (Interval)
83+
84+
let of_interval (l, u) = Lift (l, u)
85+
let of_int i = of_interval (i, i)
86+
87+
let eval_binary x1 b x2 =
88+
match x1, x2 with
89+
| Bot, _
90+
| _, Bot -> Bot
91+
| Lift i1, Lift i2 -> Lift (Interval.eval_binary i1 b i2)
92+
93+
let exclude (i: int) (x: t): t =
94+
failwith "TODO"
95+
end

src/domain/mapDomain.ml

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
(** Kujutuste domeen. *)
2+
module Make (K: sig type t [@@deriving ord, show] end) (D: Domain.S) =
3+
struct
4+
module M =
5+
struct
6+
include Map.Make (K)
7+
let pp pp_v ppf m =
8+
let pp_kv ppf (k, v) = Format.fprintf ppf "@[%a:@ %a@]" K.pp k pp_v v in
9+
let pp_sep ppf () = Format.fprintf ppf ";@ " in
10+
Format.fprintf ppf "@[{%a}@]" (Format.pp_print_list ~pp_sep pp_kv) (bindings m)
11+
end
12+
13+
(** Elementideks on kujutused. *)
14+
type t = D.t M.t [@@deriving eq, ord, show]
15+
16+
(** Leiab väärtuse, mis vaikimisi on vähim element. *)
17+
let find k m =
18+
match M.find_opt k m with
19+
| None -> D.bot
20+
| Some d -> d
21+
22+
(** Vähim element on tühi kujutus. *)
23+
let bot = M.empty
24+
25+
(** Osaline järjestus on punktiviisiline. *)
26+
let leq m1 m2 =
27+
M.for_all (fun k d1 ->
28+
let d2 = find k m2 in
29+
D.leq d1 d2
30+
) m1
31+
32+
(** Ülemraja on punktiviisiline. *)
33+
let join m1 m2 =
34+
M.merge (fun _ d1 d2 ->
35+
match d1, d2 with
36+
| None, None -> None
37+
| Some d1, None -> Some d1
38+
| None, Some d2 -> Some d2
39+
| Some d1, Some d2 -> Some (D.join d1 d2)
40+
) m1 m2
41+
42+
(** Mõned kujutuste operatsioonid. *)
43+
44+
let add = M.add
45+
let empty = M.empty
46+
let singleton = M.singleton
47+
let of_list l = M.of_seq (List.to_seq l)
48+
end

src/domain/setDomain.ml

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
(** Alamhulkade domeen. *)
2+
module Make (E: sig type t [@@deriving ord, show] end) =
3+
struct
4+
module S =
5+
struct
6+
include Set.Make (E)
7+
let pp ppf m =
8+
let pp_sep ppf () = Format.fprintf ppf ";@ " in
9+
Format.fprintf ppf "@[{%a}@]" (Format.pp_print_list ~pp_sep E.pp) (elements m)
10+
end
11+
12+
(** Elementideks on hulgad. *)
13+
type t = S.t [@@deriving eq, ord, show]
14+
15+
(** Vähim element on tühihulk. *)
16+
let bot = S.empty
17+
18+
(** Osaline järjestus on hulkade sisalduvuse järgi. *)
19+
let leq s1 s2 = S.subset s1 s2
20+
21+
(** Ülemraja on hulkade ühend. *)
22+
let join s1 s2 = S.union s1 s2
23+
24+
(** Mõned hulkade operatsioonid. *)
25+
26+
let singleton = S.singleton
27+
let add = S.add
28+
let empty = S.empty
29+
let of_list = S.of_list
30+
let fold = S.fold
31+
let remove = S.remove
32+
let union = S.union
33+
let inter = S.inter
34+
end

src/fixpoint/dune

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
(library
22
(name fixpoint)
3+
(libraries domain)
34
(preprocess (pps ppx_deriving.std)))

src/fixpoint/fixpoint.ml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,3 +44,17 @@ struct
4444
in
4545
helper D.empty initial
4646
end
47+
48+
(** Püsipunktid üle domeenide. *)
49+
module MakeDomain (D: Domain.S) =
50+
struct
51+
include Make (D)
52+
53+
(** Leiab funktsiooni vähima püsipunkti. *)
54+
let lfp (f: D.t -> D.t): D.t =
55+
fp f D.bot
56+
57+
(** Leiab funktsiooni sulundi, mis sisaldab antud domeeni elementi. *)
58+
let closure (f: D.t -> D.t) (initial: D.t): D.t =
59+
lfp (fun x -> D.join initial (f x))
60+
end

0 commit comments

Comments
 (0)