%---------------------------------------------------------------------------%
% vim: ts=4 sw=4 et ft=mercury
%---------------------------------------------------------------------------%
%
% Abother test for circular equivalence insts.
% This test is the same as circ_inst_2.m except that we
% also have a predicate which makes use of the insts.
%

:- module circ_inst_4.

:- interface.
:- import_module list.

:- inst circ1(I) == circ1(I).                       % error -- cyclic
:- inst circ2(I) == circ2(circ2(I)).                % error -- cyclic
:- inst circ3(I) == list_skel(circ3(I)).            % OK
:- inst circ4(I) == circ4(list_skel(I)).            % error -- cyclic

:- inst left(I) == right(I).                        % error -- cyclic
:- inst right(I) == left(I).                        % error -- cyclic

:- inst circ_left(I) == circ_right(list_skel(I)).   % OK
:- inst circ_right(I) == list_skel(circ_left(I)).   % OK

:- pred p(int, int, int, int, int, int, int, int).
:- mode p(in(circ1(ground)), out(circ2(ground)),
    in(circ3(ground)), out(circ4(ground)),
    in(left(ground)), out(right(ground)),
    in(circ_left(ground)), out(circ_right(ground)))
    is det.

:- implementation.

p(A, A, B, B, C, C, D, D).
