# `conforms_to_protocol/2-3`

## Description

    conforms_to_protocol(Object, Protocol)
    conforms_to_protocol(Category, Protocol)

    conforms_to_protocol(Object, Protocol, Scope)
    conforms_to_protocol(Category, Protocol, Scope)

Enumerates, by backtracking, all pairs of entities such that an object or a category conforms to a protocol. The relation scope is represented by the atoms `public`, `protected`, and `private`. This predicate implements a transitive closure for the protocol implementation relation.

## Modes and number of proofs

    conforms_to_protocol(?object_identifier, ?protocol_identifier) - zero_or_more
    conforms_to_protocol(?category_identifier, ?protocol_identifier) - zero_or_more

    conforms_to_protocol(?object_identifier, ?protocol_identifier, ?scope) - zero_or_more
    conforms_to_protocol(?category_identifier, ?protocol_identifier, ?scope) - zero_or_more

## Errors

`Object` is neither a variable nor a valid object identifier:
`type_error(object_identifier, Object)`
`Category` is neither a variable nor a valid category identifier:
`type_error(category_identifier, Category)`
`Protocol` is neither a variable nor a valid protocol identifier:
`type_error(protocol_identifier, Protocol)`
`Scope` is neither a variable nor an atom:
`type_error(atom, Scope)`
`Scope` is an atom but an invalid entity scope:
`domain_error(scope, Scope)`

## Examples

    % enumerate objects and categories that conform to the listp protocol:
    | ?- conforms_to_protocol(Object, listp).

    % enumerate objects and categories that privately conform to the listp protocol:
    | ?- conforms_to_protocol(Object, listp, private).

    % enumerate only objects that conform to the listp protocol:
    | ?- current_object(Object), conforms_to_protocol(Object, listp).

    % enumerate only categories that conform to the serialization protocol:
    | ?- current_category(Category), conforms_to_protocol(Category, serialization).

See also

current_object/1, current_protocol/1, current_category/1, implements_protocol/2-3