go:- problem(Positions,Words), new_array(Board,[10,10]), place(Words,Positions,Board). place([Word],Positions,Board):-!, write('extra:'),write_string(Word),nl. place(Words,Positions,Board):-!, select(Words,Word,WordsRest), select(Positions,Position,PositionsRest), placeWord(Word,Position,Board), place(WordsRest,PositionsRest,Board). placeWord([],_,Board). placeWord([Letter|Letters],(Row,Col,Direction),Board):- Board^[Row,Col] @= Letter, (Direction==d -> Row1 is Row+1,Col1 is Col; Row1 is Row, Col1 is Col+1), placeWord(Letters,(Row1,Col1,Direction),Board). % input data should be read from a file problem([(1,1,d),(2,3,d),(3,1,a),(5,2,a)], ["slow","again","boy","tail","bear"]). select([X|Xs],X,Xs). select([X|Xs],Y,[X|Rest]):- select(Xs,Y,Rest).