mirror of
https://github.com/Mercury-Language/mercury.git
synced 2026-04-22 04:43:53 +00:00
53 lines
1.4 KiB
Mathematica
53 lines
1.4 KiB
Mathematica
%---------------------------------------------------------------------------%
|
|
% vim: ts=4 sw=4 et ft=mercury
|
|
%---------------------------------------------------------------------------%
|
|
|
|
:- module any_free_unify.
|
|
|
|
:- interface.
|
|
:- import_module io.
|
|
|
|
:- pred main(io::di, io::uo) is det.
|
|
|
|
:- implementation.
|
|
|
|
:- import_module bool.
|
|
:- import_module list.
|
|
:- import_module std_util.
|
|
|
|
main(!IO) :-
|
|
test_any_free_unify([], Result1),
|
|
io.print(Result1, !IO),
|
|
io.nl(!IO).
|
|
|
|
:- solver type foo
|
|
where
|
|
representation is int,
|
|
ground is ground,
|
|
any is ground.
|
|
|
|
:- pred init_foo(foo::out(any)) is det.
|
|
:- pragma promise_pure(init_foo/1).
|
|
|
|
init_foo(X) :-
|
|
impure X = 'representation to any foo/0'(42).
|
|
|
|
:- pred test_any_free_unify(list(foo), bool).
|
|
:- mode test_any_free_unify(in(list_skel(any)), out) is det.
|
|
|
|
% In the unification in the condition of the if-then-else, the variable
|
|
% List has an inst which includes `any' components. Normally, we can't
|
|
% check whether `any' has become further instantiated over a goal so we
|
|
% do not allow it in a negated context. However, in this case, the `any'
|
|
% component is unified with `free' so we know that it cannot have become
|
|
% further instantiated. Therefore we should allow the unification
|
|
% in the condition.
|
|
|
|
test_any_free_unify(List, Result) :-
|
|
promise_pure
|
|
( if List = [_ | _] then
|
|
Result = no
|
|
else
|
|
Result = yes
|
|
).
|