0
votes

I am attempting to create a maze program in Prolog, whereby the aim is to find a route from the start of the maze to a point in the centre of the maze called m. The maze consists of squares which are connected using one of four colours: Blue, Green, Purple or Orange. The route from start to the centre follows a repeating pattern of the four colours.

I have created the following code:

link2(A, Colour, B) :- link(A, Colour, B).       
link2(A, Colour, B) :- link(B, Colour, A).

changecolour(blue,green).
changecolour(green,purple).
changecolour(purple,orange).
changecolour(orange,blue).

route(A, Colour1, B, List2) :-
    link2(A, Colour1, B),
    append([A], [B], List2).
route(A, Colour1, B, List2) :-
    link2(A, Colour1, X),
    changecolour(Colour1,Colour2),
    append([A], List, List2),
    \+ member(A, List),
    route(X, Colour2, B, List).

For some reason, the code isn't working as expected and I'm not sure why. I have a feeling its something to do with the negation(not member) rule but can someone advise what I'm doing wrong?

1
What is it doing, and what were you expecting?Scott Hunter
Use maplist(dif(A), Ls) to express, in a purely logical way, that A is not in the list Ls.mat
I'm aiming for the prolog to print out the route from start to m, however, when I run the trace, Prolog asks whether start is a member of a list which is just a variable, _G449 so returns > Exit: (8) lists:member(start, [start|_G452]) ? creep. Exit means success, but since we have “not member” in this instance, exiting member successfully means to fail here. "Not member" should only fail if the program comes back to a square that has already been visited.m.lewis1995
No, you'd replace \+ member(A, List) with maplist(dif(A), List).lurker
@lurker There are definitely many answers on SO by mat, false, repeat that use this idiom.user1812457

1 Answers

0
votes

You defined changecolour and never used it; you used nextcolour but never defined it.