I am writing a program in Prolog (gprolog) that pathfinds on a graph. I based it partially off of this SO post.
Let me give an example. Here is an example graph I drew:
And here is what the code initially looked like:
path([Goal],Goal,Goal).
path(P,Start,Goal) :- adjacent(Start,X),
\+ (memberchk(X,P)),
(
Goal=X
;
path([Start|P],X,Goal)
).
Regardless of whether that base case is redundant, here is the problem. I want an input style of
| ?- path(P,a,f).
and for that input, I would get output of
P = [a,s,f]
true ?
However, the problem with the code as it stands lies with memberchk
. For memberchk(a,P)
, it attempt to unify, calls memberchk(a,[a|_])
, and returns true. I don't want this to happen, so I first check if P
is instantiated using the var/1
predicate. Thus, my code changed to
path([Goal],Goal,Goal).
path(P,Start,Goal) :- var(P),
path([],Start,Goal).
path(P,Start,Goal) :- adjacent(Start,X),
\+ (memberchk(X,P)),
(
Goal=X
;
path([Start|P],X,Goal)
).
Now if P
is uninstantiated, we call path/3
with the empty list. My problem is this: now I cannot print P
at the end, as I call path([],Start,Goal)
and P
is no longer associated with []
.
I have tried using the write/1
predicate, but it either printed out P
at every step or printed P = _26
(meaning it's printing the uninstantiated P
, not the final value of P
).
I hope this is a simple problem, I'm just awfully new to Prolog.
Apologies if something similar has been asked; I would love to be pointed to other questions that could help. I searched through SO and Google before posting this.