@@ -202,6 +202,8 @@ let fold_int_int =
202
202
typed_term
203
203
(UnivApplication (UnivApplication (fold_left.term, ind_integer), ind_integer))
204
204
205
+ let every_int = typed_term (UnivApplication (every.term, ind_integer))
206
+
205
207
let true_predicate =
206
208
typed_term
207
209
(UnivQuantifier
@@ -218,6 +220,22 @@ let true_predicate_int =
218
220
let false_predicate_int =
219
221
typed_term (UnivApplication (false_predicate.term, ind_integer))
220
222
223
+ (* Represents `forall X. (X -> Bool) -> X List -> Bool`, the type for every and exists *)
224
+ let list_predicate_type =
225
+ map_type
226
+ (fun list ->
227
+ [
228
+ UnivQuantification
229
+ [
230
+ Intersection
231
+ [
232
+ ( [ Intersection [ ([ UnivTypeVar 0 ], bool_type.union) ] ],
233
+ [ Intersection [ (list , bool_type.union) ] ] );
234
+ ];
235
+ ];
236
+ ])
237
+ polymoprhic_list_type.full
238
+
221
239
let () =
222
240
test " Polymoprhic identity function type"
223
241
(is_equivalent_type polymoprhic_identity.stype expected_poly_identity_type)
@@ -574,3 +592,31 @@ let () =
574
592
(trinary_apply fold_int_int.term add.term zero.term
575
593
incrementing_integer_list.term)
576
594
(num_term 10 ))
595
+
596
+ let () =
597
+ test " Every function has the right type"
598
+ (is_subtype every.stype list_predicate_type)
599
+
600
+ let () =
601
+ test " Every function called on empty list returns true"
602
+ (evaluates_to
603
+ (binary_apply every_int.term is_even.term empty_list.term)
604
+ true_lambda.term)
605
+
606
+ let () =
607
+ test " Every is_even on simple list is false"
608
+ (evaluates_to
609
+ (binary_apply every_int.term is_even.term simple_integer_list.term)
610
+ false_lambda.term)
611
+
612
+ let () =
613
+ test " Every is_positive on incrementing integer list is true"
614
+ (evaluates_to
615
+ (binary_apply every_int.term
616
+ (Abstraction
617
+ [
618
+ (ind_positive_number, true_lambda.term);
619
+ (ind_non_positive_number, false_lambda.term);
620
+ ])
621
+ incrementing_integer_list.term)
622
+ true_lambda.term)
0 commit comments