1 % evaluation of ProB AST set expressions
2
3 :- use_module(library(sets)).
4 :- use_module(library(lists),[is_list/1,maplist/3]).
5 :- use_module(library(avl)).
6
7 % returns avl_set
8 sint_avl(Expression,avl_set(AVL)) :-
9 sint(Expression,Value) ,
10 findall(Key-true,member(Key,Value),AVLList) ,
11 list_to_avl(AVLList,AVL).
12
13 % ast record
14 sint(b(rec(Record),_,_),rec(NewRecord)) :-
15 maplist(sint,Record,NewRecord).
16 % value field
17 sint(field(Name,Value),field(Name,NewValue)) :-
18 sint(Value,Temp) ,
19 ( number(Temp) ->
20 NewValue = int(Temp)
21 ; Temp = true ->
22 NewValue = pred_true
23 ; Temp = false ->
24 NewValue = pred_false
25 ; NewValue = string(Temp)).
26
27 % ast set expressions
28 sint(b(set_extension([]),_,_),[]).
29
30 sint(b(boolean_true,_,_),true).
31 sint(b(boolean_false,_,_),false).
32 sint(b(string(String),_,_),String).
33 sint(b(integer(Integer),_,_),Integer).
34
35 sint(b(value(Set),_,_),Set) :-
36 is_list(Set).
37 sint(b(value(avl_set(AvlSet)),_,_),Set) :-
38 avl_to_list(AvlSet,AVLList) ,
39 findall(Key,member(Key-_,AVLList),Set).
40
41 sint(b(interval(b(integer(A),integer,_),b(integer(B),integer,_)),set(integer),_),Value) :-
42 interval(A,B,Value).
43
44 sint(b(union(Set1,Set2),_,_),Value) :-
45 sint(Set1,ValueSet1) ,
46 sint(Set2,ValueSet2) ,
47 union(ValueSet1,ValueSet2,Value).
48
49 sint(b(general_union(Set),_,_),Value) :-
50 sint(Set,ValueSet) ,
51 flatten(ValueSet,Value).
52
53 sint(b(intersection(Set1,Set2),_,_),Value) :-
54 sint(Set1,ValueSet1) ,
55 sint(Set2,ValueSet2) ,
56 intersection(ValueSet1,ValueSet2,Value).
57
58 sint(b(general_intersection(Set),_,_),Value) :-
59 sint(Set,ValueSet) ,
60 flatten(ValueSet,Value).
61
62 sint(b(set_subtraction(Set1,Set2),_,_),Value) :-
63 sint(Set1,ValueSet1) ,
64 sint(Set2,ValueSet2) ,
65 subtract(ValueSet1,ValueSet2,Value).
66
67 sint(b(set_extension(Set),set(_),_),Value) :-
68 is_list(Set) ,
69 % convert to prob value list set
70 maplist(ast_to_prob_value,Set,Value).
71
72 sint(b(set_extension(Temp),_,_),[Set]) :-
73 sint(Temp,Set).
74
75 % create list from an interval
76 interval(A,A,[A]) :- !.
77 interval(A,B,[A|T]) :-
78 A1 is A + 1 ,
79 interval(A1,B,T).
80
81 % convert to prob value
82 ast_to_prob_value(b(integer(Value),_,_),int(Value)).
83 ast_to_prob_value(b(string(Value),_,_),string(Value)).
84 ast_to_prob_value(b(Bool,_,_),Value) :-
85 (Bool = boolean_true -> Value = pred_true ; Bool = boolean_false -> Value = pred_false).
86 % true for prob value
87 ast_to_prob_value(_,_).
88 % convert to prolog value
89 ast_to_value(int(Value),Value).
90 ast_to_value(string(Value),Value).
91 ast_to_value(Bool,Value) :-
92 (Bool = pred_true -> Value = true ; Bool = pred_false -> Value = false).
93 ast_to_value(b(integer(Value),_,_),Value).
94 ast_to_value(b(string(Value),_,_),Value).
95 ast_to_value(b(Bool,_,_),Value) :-
96 (Bool = boolean_true -> Value = true ; Bool = boolean_false -> Value = false).