**Write a binary-predicate list test**

A binary-predicate is a function that tests a relation between two arguments. A binary-predicate has the general signature:

- : 'a -> 'a -> bool = <fun>

As examples `=`

and `&&`

are both symmetric binary-predicates:

# (=);; - : 'a -> 'a -> bool = <fun> # (&&);; - : bool -> bool -> bool = <fun>

**a)** Implement `exists_symmetric`

that tests if `list`

contains distinct items `x`

and `y`

such that `pred x y = pred y x = true`

.

let exists_symmetric pred list = ... ;; val exists_symmetric : ('a -> 'a -> bool) -> 'a list -> bool = <fun>

**b)** There also exists asymmetric binary-predicates such as `<`

and `>`

:

# (>);; - : 'a -> 'a -> bool = <fun>

Implement `exists_asymmetric`

that tests if `list`

contains distinct items `x`

and `y`

such that `(pred x y) or (pred y x) = true`

.

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 = ... ;;

A sub-pattern is a less general, more specific pattern.

Two patterns are said to be unifiable iff there exist one pattern object that is a sub-pattern of both of them.

Let `unifiable`

be the unifiability test:

let unifiable pat1 pat2 = ... ;; val unifiable : pattern -> pattern -> bool = <fun>

A choice is a list of patterns.

A choice is said to be determinist iff there exist no pattern object that is a sub-pattern of more than one pattern within the choice. That is iff there doesn't exist two patterns within the choice that are unifiable. Using `exists_symmetric`

, implement `determinist_choice`

that tests if a `pat_list`

choice is determinist:

let determinist_choice pat_list = ... ;; val determinist_choice : pattern list -> bool = <fun>