CPSC 322 - Lecture 30 - November 17, 2004

CPSC 322 - Lecture 30

Move generation for the peg puzzle in CILOG


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,[Newhead|Newrest]) <-
          replace_subseq(Board,Oldseq,Newseq,Newhead) &
          all_replacements(Board,Oldseq,Newseq,Newrest) &
          no_duplicates([Newhead|Newrest]).  

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).

no_duplicates([]).
no_duplicates([H|T]) <- notmember(H,T) &
                        no_duplicates(T).

notmember(X,Y) <- ~member(X,Y).

member(H,[H|T]).
member(X,[H|T]) <- member(X,T).

/*
notmember(X,[]).
notmember(X,[H|T]) <- X\=H & notmember(X,T).
*/

Last revised: November 17, 2004