let rec lists_equal (equal: '-> '-> bool) (list1: 'a list) (list2: 'b list) : bool =
  match list1, list2 with
    | [], [] ->
        true

    | head1 :: tail1, head2 :: tail2 when
        equal head1 head2 ->
        lists_equal equal tail1 tail2

    | _ ->
        false