[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) :-
     breadthfirst(Succ, Goal, [[Start]], Solution).

:- pred breadthfirst(pred(T,T)::in, pred(T)::in, list(list(T))::in,  
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) :-
     breadthfirst(Succ, Goal, [[Start]], Solution).

:- pred breadthfirst(pred(T,T)::in, pred(T)::in, list(list(T))::in,  
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),
	breadthfirst(Succ, Goal, Paths1, Solution).
	
:- 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
Administrative Queries: owner-mercury-users at csse.unimelb.edu.au
Subscriptions:          mercury-users-request at csse.unimelb.edu.au
--------------------------------------------------------------------------



More information about the users mailing list