# [mercury-users] Newbie Q on type parameters

Tom Davies tgdavies at gmail.com
Mon Aug 27 23:36:50 AEST 2007

```Hi,

I'm trying to convert a working Mercury program to a more flexible
one which uses type parameters and higher order predicates.

I'm getting error messages which I don't understand.

In particular, I get:

solve.m:030: In clause for `breadthfirst(in, in, in, out)':
solve.m:030:   in argument 1 (i.e. the predicate term) of higher-order
solve.m:030:   predicate call:
solve.m:030:   mode error: variable `Goal' has instantiatedness
`ground',
solve.m:030:   expecting higher-order pred inst (of arity 1).

for:

...
:- pred goal(node).
:- mode goal(in) is semidet.
goal(Situation) :-
Situation = g.

:- pred solve(pred(T,T)::in, pred(T)::in, T::in, list(T)::out) is
nondet.
solve(Succ, Goal, Start, Solution) :-

list(T)::out) is nondet.
breadthfirst(Succ, Goal, [[Node | Path] | _], [Node | Path]) :-
call(Goal,Node). % <---- line 30
...

Thanks for any advice, the full text of the program is below.

Tom

:- module solve.
:- interface.
:- import_module io.
:- pred main(io::di, io::uo) is cc_multi.
:- implementation.
:- import_module list.
:- import_module solutions.

:- type node ---> a; b; c; d; e; f; g.
:- pred s(node,node).
:- mode s(in,out) is nondet.
s(a,b).
s(a,c).
s(b,d).
s(b,e).
s(d,f).
s(e,g).

:- pred goal(node).
:- mode goal(in) is semidet.
goal(Situation) :-
Situation = g.

:- pred solve(pred(T,T)::in, pred(T)::in, T::in, list(T)::out) is
nondet.
solve(Succ, Goal, Start, Solution) :-

list(T)::out) is nondet.
breadthfirst(Succ, Goal, [[Node | Path] | _], [Node | Path]) :-
call(Goal,Node).

breadthfirst(Succ, Goal, [Path | Paths], Solution) :-
trace [io(!IO)] (io.write_list([Path | Paths], "---\n", io.print, !IO),
io.nl(!IO)),
extend(Succ, Path, NewPaths),
append(Paths, NewPaths, Paths1),

:- pred extend(pred(T,T)::in,list(T)::in,list(list(T))::out) is nondet.
extend(Succ, [Node | Path], NewPaths) :-
solutions(
pred(X::out) is nondet :-
(
X = [NewNode, Node | Path],
call(Succ, Node, NewNode),
not member(NewNode, [Node | Path])
),
NewPaths).

/*
* Note that the solution returned by solve starts with the final
goal node, so
* we reverse it before printing it.
*/
main(!IO) :-
if solve(s,goal,a,S) then
reverse(S,S1), print(S1,!IO)
else
print("Failed\n",!IO).

--------------------------------------------------------------------------
mercury-users mailing list
Post messages to:       mercury-users at csse.unimelb.edu.au