Upload
rolf-hines
View
213
Download
1
Embed Size (px)
Citation preview
1
Logic ProgrammingSchool of Informatics, University of Edinburgh
A Basic Interactive Game
play(Result) :- initialise(Game, Position, Player), display_game(Position, Player), play(Position, Player, Result).
play(Position, Player, Result) :- game_over(Position, Player, Result),!, announce(Result).play(Position, Player, Result) :- choose_move(Position, Player, Move), move(Move, Position, NewPosition), display_game(NewPosition, Player), next_player(Player, NewPlayer), !, play(NewPosition, NewPlayer, Result).
Sets initial state
Displays game state
Terminating state
Display the result
Decide on a move
Update the state
Choose who’s next
2
Logic ProgrammingSchool of Informatics, University of Edinburgh
Noughts and Crosses
play :- initialise(Game, Position, Player), display_game(Position, Player), play(Position, Player, Result).
play(Position, Player, Result) :- game_over(Position, Player, Result),!, announce(Result).play(Position, Player, Result) :- choose_move(Position, Player, Move), move(Move, Position, NewPosition), display_game(NewPosition, Player), next_player(Player, NewPlayer), !, play(NewPosition, NewPlayer, Result).
X
3
Logic ProgrammingSchool of Informatics, University of Edinburgh
Noughts and Crosses
play :- initialise(Game, Position, Player), display_game(Position, Player), play(Position, Player, Result).
play(Position, Player, Result) :- game_over(Position, Player, Result),!, announce(Result).play(Position, Player, Result) :- choose_move(Position, Player, Move), move(Move, Position, NewPosition), display_game(NewPosition, Player), next_player(Player, NewPlayer), !, play(NewPosition, NewPlayer, Result).
X
X
OX
X
4
Logic ProgrammingSchool of Informatics, University of Edinburgh
Noughts and Crosses
play :- initialise(Game, Position, Player), display_game(Position, Player), play(Position, Player, Result).
play(Position, Player, Result) :- game_over(Position, Player, Result),!, announce(Result).play(Position, Player, Result) :- choose_move(Position, Player, Move), move(Move, Position, NewPosition), display_game(NewPosition, Player), next_player(Player, NewPlayer), !, play(NewPosition, NewPlayer, Result).
XOX
5
Logic ProgrammingSchool of Informatics, University of Edinburgh
Noughts and Crosses
play :- initialise(Game, Position, Player), display_game(Position, Player), play(Position, Player, Result).
play(Position, Player, Result) :- game_over(Position, Player, Result),!, announce(Result).play(Position, Player, Result) :- choose_move(Position, Player, Move), move(Move, Position, NewPosition), display_game(NewPosition, Player), next_player(Player, NewPlayer), !, play(NewPosition, NewPlayer, Result).
XX
X OO
6
Logic ProgrammingSchool of Informatics, University of Edinburgh
Representing Game State: Examples
board(x, [x,e,o,e,x,o,e,e,x]).
board(x, [x,_,o,_,x,o,_,_,x]).
board(P, [S1,S2,S3,S4,S5,S6,S7,S8,S9], [ [S1,S2,S3], [S4,S5,S6], [S7,S8,S9], [S1,S4,S7], [S2,S5,S8], [S3,S6,S9], [S1,S5,S9], [S3,S5,S7] ]).
board(x, player(x,[1,5,9]), player(o,[3,6])).
7
Logic ProgrammingSchool of Informatics, University of Edinburgh
Input and Output (Prolog Terms)
| ?- read(X).: move(5).X = move(5)
| ?- write([x,e,e,x,o,e,e,e,e]), nl.([x,e,e,x,o,e,e,e,e])
Reads a Prolog Term from the standard input
Writes a Prolog Term to the standard output
Throws a new line on the standard input
8
Logic ProgrammingSchool of Informatics, University of Edinburgh
A Simple Recursive Input Program
read_until([Input|Rest], Prompt, StopTerm) :-write(Prompt),read(Input),\+ Input = StopTerm, !,read_until(Rest, Prompt, StopTerm).
read_until([], _, _).
| ?- read_until(X, 'Input data : ', stop).Input data : foo(a).Input data : baz.Input data : stop.
X = [foo(a), baz]
9
Logic ProgrammingSchool of Informatics, University of Edinburgh
Input (Characters)
| ?- read_word_list(X).|: You can find this program in Sterling and Shapiro
X = [‘You’,can,find,this,program,in,’Sterling’,and,’Shapiro’]
10
Logic ProgrammingSchool of Informatics, University of Edinburgh
Input (Characters)
read_word_list(Ws) :- get0(C), read_word_list(C, Ws).
read_word_list(C, [W|Ws]) :-word_char(C),read_word(C, W, C1),read_word_list(C1, Ws).
read_word_list(C, Ws) :-fill_char(C),get0(C1),read_word_list(C1, Ws).
read_word_list(C, []) :-end_of_words_char(C).
fill_char(32).
end_of_words_char(46).end_of_words_char(63).
Full stop
Question mark
Reads the first character from standard
input
11
Logic ProgrammingSchool of Informatics, University of Edinburgh
Reading a Word
read_word(C, W, C1):-word_chars(C, Cs, C1),name(W, Cs).
word_chars(C, [C|Cs], C0):-word_char(C), !,get0(C1),word_chars(C1, Cs, C0).
word_chars(C, [], C):-\+ word_char(C).
word_char(C):- 97 =< C, C =< 122.word_char(C):- 65 =< C, C =< 90.word_char(C):- 48 =< C, C =< 57.word_char(95).
Lower case letter
Upper case letter
Number
Underscore