Write a dyadic-predicate list test
A dyadic-predicate is a function that tests a relation between two arguments. A dyadic-predicate has the signature:
- : 'a -> 'a -> bool = <fun>
As an example &&
is a dyadic-predicate:
(&&);; - : bool -> bool -> bool = <fun>
a) Implement exists_symmetric
that tests if list
contains two items that satisfy pred
:
let exists_symmetric pred list = ... ;; val exists_symmetric : ('a -> 'a -> bool) -> 'a list -> bool = <fun>
b) Now suppose pred
is asymmetric, that is, generally:
pred(a,b) != pred(b,a)
Implement the corresponding exists_asymmetric
test:
let exists_asymmetric pred list = ... ;; val exists_asymmetric : ('a -> 'a -> bool) -> 'a list -> bool = <fun>
c) Let pattern
be the following declared type:
type pattern = ... ;;
And let unifiable
be the following function that tests if two patterns are compatible:
let unifiable pat1 pat2 = ... ;; val unifiable : pattern -> pattern -> bool = <fun>
A choice is a list of patterns. A choice is determinist if and only if no expression is compatible with more than one of its patterns. Using exists_symmetric
, implement determinist_choice
that tests if a choice is determinist:
let determinist_choice pat_list = ... ;; val determinist_choice : pattern list -> bool = <fun>