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