1 | %% AST Node types for fuzzing. | |
2 | % This is a subset of the types specified in probsrc(btypechecker) | |
3 | % and might be altered. | |
4 | ||
5 | :- module(fuzztypes, [has_type/2, | |
6 | primary_type/1, | |
7 | primitive_type/1, | |
8 | higher_order_type/1, | |
9 | higher_order_sub_types/2, | |
10 | child_types/2, | |
11 | node_by_name/2, | |
12 | node_info/3, | |
13 | is_leaf_node/1 | |
14 | ]). | |
15 | ||
16 | :- op(600, xfy, (<:>)). | |
17 | ||
18 | :- use_module(library(lists), [maplist/2]). | |
19 | ||
20 | ||
21 | has_type(nat_set, set(integer)). % Special case for integer_set('NAT'). | |
22 | has_type(natural_set, set(integer)). % Special case for integer_set('NATURAL'). | |
23 | has_type(nat1_set, set(integer)). % Special case for integer_set('NAT1'). | |
24 | has_type(natural1_set, set(integer)). % Special case for integer_set('NATURAL1'). | |
25 | has_type(int_set, set(integer)). % Special case for integer_set('INT'). | |
26 | has_type(integer_set, set(integer)). % Special case for integer_set('INTEGER'). | |
27 | has_type(Term, Type) :- | |
28 | Term <:> Type. | |
29 | ||
30 | ||
31 | primitive_type(integer). | |
32 | primitive_type(real). | |
33 | % primitive_type(pred). % Note: Never generate a random pred type expression. | |
34 | primitive_type(boolean). | |
35 | primitive_type(string). | |
36 | ||
37 | higher_order_type(set(_)). | |
38 | higher_order_type(seq(_)). | |
39 | higher_order_type(couple(_, _)). | |
40 | ||
41 | higher_order_sub_types(set(A), [A]). | |
42 | higher_order_sub_types(seq(A), [A]). | |
43 | higher_order_sub_types(couple(A, B), [A, B]). | |
44 | ||
45 | primary_type(T) :- primitive_type(T), !. | |
46 | primary_type(T) :- | |
47 | higher_order_type(T), | |
48 | higher_order_sub_types(T, SubTypes), | |
49 | maplist(primary_type, SubTypes). | |
50 | ||
51 | ||
52 | ||
53 | node_info(Name, Type, Children) :- | |
54 | has_type(Node, Type), % TODO: Maybe find version that doesn't traverse all has_type/2 rules. | |
55 | Node =.. [Name|Children]. | |
56 | ||
57 | ||
58 | node_by_name(Name, Node) :- | |
59 | node_info(Name, _, Children), | |
60 | Node =.. [Name|Children]. | |
61 | ||
62 | ||
63 | is_leaf_node(Name) :- | |
64 | node_info(Name, _, []). | |
65 | ||
66 | ||
67 | % predicates | |
68 | truth <:> pred. | |
69 | falsity <:> pred. | |
70 | conjunct(pred,pred) <:> pred. | |
71 | %conjunct([pred]) <:> pred. | |
72 | negation(pred) <:> pred. | |
73 | disjunct(pred,pred) <:> pred. | |
74 | %disjunct([pred]) <:> pred. | |
75 | implication(pred,pred) <:> pred. | |
76 | equivalence(pred,pred) <:> pred. | |
77 | equal(A,A) <:> pred. | |
78 | not_equal(A,A) <:> pred. | |
79 | member(A,set(A)) <:> pred. | |
80 | not_member(A,set(A)) <:> pred. | |
81 | subset(set(A),set(A)) <:> pred. | |
82 | subset_strict(set(A),set(A)) <:> pred. | |
83 | not_subset(set(A),set(A)) <:> pred. | |
84 | not_subset_strict(set(A),set(A)) <:> pred. | |
85 | less_equal(integer,integer) <:> pred. | |
86 | less(integer,integer) <:> pred. | |
87 | less_equal_real(real,real) <:> pred. | |
88 | less_real(real,real) <:> pred. | |
89 | greater_equal(integer,integer) <:> pred. | |
90 | greater(integer,integer) <:> pred. | |
91 | finite(set(_)) <:> pred. | |
92 | exists(ids,pred) <:> pred. | |
93 | forall(ids,pred,pred) <:> pred. % Added by hand | |
94 | partition(set(T),[set(T)]) <:> pred. | |
95 | ||
96 | % expressions | |
97 | boolean_true <:> boolean. | |
98 | boolean_false <:> boolean. | |
99 | max_int <:> integer. | |
100 | min_int <:> integer. | |
101 | empty_set <:> set(_). | |
102 | bool_set <:> set(boolean). | |
103 | float_set <:> set(real). | |
104 | real_set <:> set(real). | |
105 | string_set <:> set(string). | |
106 | convert_bool(pred) <:> boolean. | |
107 | convert_real(integer) <:> real. | |
108 | convert_int_floor(real) <:> integer. | |
109 | convert_int_ceiling(real) <:> integer. | |
110 | add(integer,integer) <:> integer. | |
111 | add_real(real,real) <:> real. | |
112 | minus(integer,integer) <:> integer. | |
113 | minus_real(real,real) <:> real. | |
114 | unary_minus(integer) <:> integer. | |
115 | unary_minus_real(real) <:> real. | |
116 | multiplication(integer,integer) <:> integer. | |
117 | multiplication_real(real,real) <:> real. | |
118 | cartesian_product(set(A),set(B)) <:> set(couple(A,B)). | |
119 | div(integer,integer) <:> integer. | |
120 | div_real(real,real) <:> real. | |
121 | floored_div(integer,integer) <:> integer. | |
122 | modulo(integer,integer) <:> integer. | |
123 | power_of(integer,integer) <:> integer. | |
124 | power_of_real(real,real) <:> real. | |
125 | successor <:> set(couple(integer,integer)). | |
126 | predecessor <:> set(couple(integer,integer)). | |
127 | max(set(integer)) <:> integer. | |
128 | min(set(integer)) <:> integer. | |
129 | max_real(set(real)) <:> real. | |
130 | min_real(set(real)) <:> real. | |
131 | card(set(_)) <:> integer. | |
132 | couple(A,B) <:> couple(A,B). | |
133 | pow_subset(set(A)) <:> set(set(A)). | |
134 | pow1_subset(set(A)) <:> set(set(A)). | |
135 | fin_subset(set(A)) <:> set(set(A)). | |
136 | fin1_subset(set(A)) <:> set(set(A)). | |
137 | interval(integer,integer) <:> set(integer). | |
138 | union(set(A),set(A)) <:> set(A). | |
139 | intersection(set(A),set(A)) <:> set(A). | |
140 | set_subtraction(set(A),set(A)) <:> set(A). /* ?? */ | |
141 | general_union(set(set(A))) <:> set(A). | |
142 | general_intersection(set(set(A))) <:> set(A). | |
143 | relations(set(A),set(B)) <:> set(set(couple(A,B))). | |
144 | identity(set(A)) <:> set(couple(A,A)). | |
145 | reverse(set(couple(A,B))) <:> set(couple(B,A)). % function inverse ~ | |
146 | first_projection(set(A),set(B)) <:> set(couple(couple(A,B),A)). | |
147 | % event_b_first_projection(set(couple(A,B))) <:> set(couple(couple(A,B),A)). % should no longer appear after Rodin 1.0 | |
148 | second_projection(set(A),set(B)) <:> set(couple(couple(A,B),B)). | |
149 | % event_b_second_projection(set(couple(A,B))) <:> set(couple(couple(A,B),B)). % should no longer appear after Rodin 1.0 | |
150 | first_of_pair(couple(A,_)) <:> A. % new | |
151 | second_of_pair(couple(_,B)) <:> B. % new | |
152 | composition(set(couple(A,B)),set(couple(B,C))) <:> set(couple(A,C)). | |
153 | ring(set(couple(B,C)),set(couple(A,B))) <:> set(couple(A,C)). | |
154 | direct_product(set(couple(E,F)),set(couple(E,G))) <:> set(couple(E,couple(F,G))). | |
155 | parallel_product(set(couple(E,F)),set(couple(G,H))) <:> set(couple(couple(E,G),couple(F,H))). | |
156 | trans_function(set(couple(A,B))) <:> set(couple(A,set(B))). | |
157 | trans_relation(set(couple(A,set(B)))) <:> set(couple(A,B)). | |
158 | iteration(set(couple(A,A)),integer) <:> set(couple(A,A)). | |
159 | reflexive_closure(set(couple(A,A))) <:> set(couple(A,A)). | |
160 | closure(set(couple(A,A))) <:> set(couple(A,A)). | |
161 | domain(set(couple(A,_))) <:> set(A). | |
162 | range(set(couple(_,B))) <:> set(B). | |
163 | image(set(couple(A,B)),set(A)) <:> set(B). | |
164 | domain_restriction(set(A),set(couple(A,B))) <:> set(couple(A,B)). | |
165 | domain_subtraction(set(A),set(couple(A,B))) <:> set(couple(A,B)). | |
166 | range_restriction(set(couple(A,B)),set(B)) <:> set(couple(A,B)). | |
167 | range_subtraction(set(couple(A,B)),set(B)) <:> set(couple(A,B)). | |
168 | overwrite(set(couple(A,B)),set(couple(A,B))) <:> set(couple(A,B)). | |
169 | partial_function(A,B)<:>T :- relations(A,B)<:>T. | |
170 | total_function(A,B)<:>T :- relations(A,B)<:>T. | |
171 | partial_injection(A,B)<:>T :- relations(A,B)<:>T. | |
172 | total_injection(A,B)<:>T :- relations(A,B)<:>T. | |
173 | partial_surjection(A,B)<:>T :- relations(A,B)<:>T. | |
174 | total_surjection(A,B)<:>T :- relations(A,B)<:>T. | |
175 | total_bijection(A,B)<:>T :- relations(A,B)<:>T. | |
176 | partial_bijection(A,B)<:>T :- relations(A,B)<:>T. | |
177 | total_relation(A,B)<:>T :- relations(A,B)<:>T. | |
178 | surjection_relation(A,B)<:>T :- relations(A,B)<:>T. | |
179 | total_surjection_relation(A,B)<:>T :- relations(A,B)<:>T. | |
180 | seq(set(A)) <:> set(seq(A)). | |
181 | seq1(X)<:>T :- seq(X)<:>T. | |
182 | iseq(X)<:>T :- seq(X)<:>T. | |
183 | iseq1(X)<:>T :- seq(X)<:>T. | |
184 | perm(set(A)) <:> set(seq(A)). | |
185 | empty_sequence <:> seq(_). | |
186 | size(seq(_)) <:> integer. | |
187 | first(seq(A)) <:> A. | |
188 | last(seq(A)) <:> A. | |
189 | front(seq(A)) <:> seq(A). | |
190 | tail(seq(A)) <:> seq(A). | |
191 | rev(seq(A)) <:> seq(A). | |
192 | concat(seq(A),seq(A)) <:> seq(A). | |
193 | insert_front(A,seq(A)) <:> seq(A). | |
194 | insert_tail(seq(A),A) <:> seq(A). | |
195 | restrict_front(seq(A),integer) <:> seq(A). | |
196 | restrict_tail(seq(A),integer) <:> seq(A). | |
197 | general_concat(seq(seq(A))) <:> seq(A). | |
198 | function(set(couple(A,B)),A) <:> B. | |
199 | set_extension([T]) <:> set(T). | |
200 | sequence_extension([T]) <:> seq(T). | |
201 | comprehension_set(ids(T),pred) <:> set(T). % ids(T) means T is the cross product of all types in the ID list. | |
202 | event_b_comprehension_set(ids,T,pred) <:> set(T). | |
203 | lambda(ids(A),pred,R) <:> set(couple(A,R)). % ids(A) means A is the cross product of all types in the ID list. | |
204 | general_sum(ids,pred,T) <:> T :- member(T, [integer,real]). | |
205 | general_product(ids,pred,T) <:> T :- member(T, [integer,real]). | |
206 | quantified_union(ids,pred,set(T)) <:> set(T). | |
207 | quantified_intersection(ids,pred,set(T)) <:> set(T). | |
208 | mu(set(T)) <:> T. | |
209 | if_then_else(pred,T,T) <:> T. | |
210 | % tree(set(A)) <:> set(set(couple(seq(integer),A))). % Section 5.20 of Atelier-B manrefb.pdf | |
211 | % btree(A) <:> T :- tree(A) <:> T. | |
212 | % tree_over(A) <:> set(couple(seq(integer),A)). % dummy function to ease writing of rules below | |
213 | % const(A,seq(TreeA)) <:> TreeA :- tree_over(A) <:> TreeA. | |
214 | % top(TreeA) <:> A :- tree_over(A) <:> TreeA. | |
215 | % prefix(TreeA) <:> seq(A) :- tree_over(A) <:> TreeA. | |
216 | % postfix(TreeA) <:> seq(A) :- tree_over(A) <:> TreeA. | |
217 | % sizet(TreeA) <:> integer :- tree_over(_) <:> TreeA. | |
218 | % mirror(TreeA) <:> TreeA :- tree_over(_) <:> TreeA. | |
219 | % rank(TreeA,seq(integer)) <:> integer :- tree_over(_) <:> TreeA. % seq(integer) is the type of paths | |
220 | % father(TreeA,seq(integer)) <:> seq(integer) :- tree_over(_) <:> TreeA. | |
221 | % son(TreeA,seq(integer),integer) <:> seq(integer) :- tree_over(_) <:> TreeA. | |
222 | % subtree(TreeA,seq(integer)) <:> TreeA :- tree_over(_) <:> TreeA. | |
223 | % arity(TreeA,seq(integer)) <:> integer :- tree_over(_) <:> TreeA. | |
224 | % sons(TreeA) <:> seq(TreeA) :- tree_over(_) <:> TreeA. | |
225 | % bin(A) <:> TreeA :- tree_over(A) <:> TreeA. | |
226 | % bin(TreeA,A,TreeA) <:> TreeA :- tree_over(A) <:> TreeA. | |
227 | % infix(TreeA) <:> seq(A) :- tree_over(A) <:> TreeA. | |
228 | % left(TreeA) <:> TreeA :- tree_over(_) <:> TreeA. | |
229 | % right(TreeA) <:> TreeA :- tree_over(_) <:> TreeA. | |
230 | ||
231 | child_types(NodeName, Children) :- | |
232 | has_type(Node, _), | |
233 | Node =.. [NodeName|Children], | |
234 | !. |