CPSC 322 - Lecture 30 - November 17, 2004

CPSC 322 - Lecture 30

Move generation for the peg puzzle in Prolog


gen_all_moves(X,Movelist) :- gen_all_blue_moves(X,Bluemoves) ,
                             gen_all_red_moves(X,Redmoves) ,
                             append(Bluemoves,Redmoves,Movelist).

gen_all_blue_moves(X,Bluemoves) :- gen_all_blue_slides(X,Blueslides) ,
                                   gen_all_blue_jumps(X,Bluejumps) ,
                                   append(Blueslides,Bluejumps,Bluemoves).

gen_all_red_moves(X,Redmoves) :- gen_all_red_slides(X,Redslides) ,
                                 gen_all_red_jumps(X,Redjumps) ,
                                 append(Redslides,Redjumps,Redmoves).

gen_all_blue_slides(Board,Newboards) :- 
     all_replacements(Board,[b,-],[-,b],Newboards).

gen_all_blue_jumps(Board,Newboards) :-
     all_replacements(Board,[b,r,-],[-,r,b],Newboards).

gen_all_red_slides(Board,Newboards) :-
     all_replacements(Board,[-,r],[r,-],Newboards).

gen_all_red_jumps(Board,Newboards) :-
     all_replacements(Board,[-,b,r],[r,b,-],Newboards).

all_replacements(Board,Oldseq,Newseq,Y) :-
          bagof(X,replace_subseq(Board,Oldseq,Newseq,X),Y).

all_replacements(Board,Oldseq,Newseq,[]).

replace_subseq(Oldseq,Oldsubseq,Newsubseq,Newseq) :- append(L1,L2,Oldseq) ,
                                                     append(Oldsubseq,L3,L2) ,
                                                     append(Newsubseq,L3,L4) ,
                                                     append(L1,L4,Newseq).

append([],Z,Z).
append([A|X],Y,[A|Z]) :- append(X,Y,Z).

Last revised: November 17, 2004