/export/starexec/sandbox/solver/bin/starexec_run_standard /export/starexec/sandbox/benchmark/theBenchmark.pl /export/starexec/sandbox/output/output_files -------------------------------------------------------------------------------- Graph construction failed Graph construction failed Graph construction failed MAYBE proof of /export/starexec/sandbox/benchmark/theBenchmark.pl # AProVE Commit ID: 48fb2092695e11cc9f56e44b17a92a5f88ffb256 marcel 20180622 unpublished dirty Left Termination of the query pattern play(g,g,a) w.r.t. the given Prolog program could not be shown: (0) Prolog (1) NotTransformerProof [EQUIVALENT, 0 ms] (2) Prolog (3) CallTransformerProof [EQUIVALENT, 0 ms] (4) Prolog (5) CutEliminatorProof [SOUND, 0 ms] (6) Prolog (7) FailTransformerProof [EQUIVALENT, 0 ms] (8) Prolog (9) UnifyTransformerProof [EQUIVALENT, 0 ms] (10) Prolog (11) UndefinedPredicateHandlerProof [SOUND, 0 ms] (12) Prolog (13) IntegerArithmeticTransformerProof [SOUND, 0 ms] (14) Prolog (15) NotTransformerProof [EQUIVALENT, 0 ms] (16) Prolog (17) CallTransformerProof [EQUIVALENT, 0 ms] (18) Prolog (19) CutEliminatorProof [SOUND, 0 ms] (20) Prolog (21) FailTransformerProof [EQUIVALENT, 0 ms] (22) Prolog (23) UnifyTransformerProof [EQUIVALENT, 0 ms] (24) Prolog (25) OrTransformerProof [EQUIVALENT, 0 ms] (26) Prolog (27) UndefinedPredicateHandlerProof [SOUND, 0 ms] (28) Prolog ---------------------------------------- (0) Obligation: Clauses: play(Game) :- ','(initialize(Game, Position, Player), ','(display_game(Position), play(Position, Player, Result))). play(Position, Player, Result) :- ','(game_over(Position, Player, Result), ','(!, ','(write(Result), abolish0(player)))). play(Position, Player, Result) :- ','(choose(Position, Player, Move), ','(move(Move, Player, Position, Position1), ','(display_game(Position1), ','(next_player(Player, Player1), ','(!, play(Position1, Player1, Result)))))). choose(Position, computer, Move) :- ','(write('Computer is thinking...'), ','(nl, alpha_beta(computer, Position, -1, 1, Move, Value))). choose(Position, Player, Move) :- ','(write(Player), ','(write(', enter move (followed by a period and return) --> '), ','(read(Move1), legal(Position, Player, Move1, Move)))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(==(Player, computer), ','(game_win_o(Position), is(Value, 1))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(player(Player), ','(game_win_x(Position), is(Value, 1))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(game_tie(Position), is(Value, 0)). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(==(Player, computer), ','(game_win_x(Position), is(Value, -1))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(player(Player), ','(game_win_o(Position), is(Value, -1))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(setof(Move1, move(Position, Move1), Moves), ','(is(Alpha1, -(Beta)), ','(is(Beta1, -(Alpha)), evaluate(Player, Moves, Position, Alpha1, Beta1, nil, ','(Move, Value))))). evaluate(Player, .(Move, Moves), Position, Alpha, Beta, Move1, Best) :- ','(move(Move, Player, Position, Position1), ','(next_player(Player, Player1), ','(alpha_beta(Player1, Position1, Alpha, Beta, MoveX, Value), ','(is(Value1, -(Value)), ','(cutoff(Player, Move, Value1, Alpha, Beta, Moves, Position, Move1, Best), !))))). evaluate(Player, [], Position, Alpha, Beta, Move, ','(Move, Alpha)). cutoff(Player, Move, Value, Alpha, Beta, Moves, Position, Move1, ','(Move, Value)) :- ','(>=(Value, Beta), !). cutoff(Player, Move, Value, Alpha, Beta, Moves, Position, Move1, Best) :- ','(<(Alpha, Value), ','(<(Value, Beta), ','(!, evaluate(Player, Moves, Position, Value, Beta, Move, Best)))). cutoff(Player, Move, Value, Alpha, Beta, Moves, Position, Move1, Best) :- ','(=<(Value, Alpha), ','(!, evaluate(Player, Moves, Position, Alpha, Beta, Move1, Best))). initialize(tictactoe, ','(','(' ', ','(' ', ' ')), ','(','(' ', ','(' ', ' ')), ','(' ', ','(' ', ' ')))), Player) :- ','(write('Enter player`s name (followed by a period and return) --> '), ','(read(Player), ','(write(Player), ','(write(', you will go first and use the symbol "x".'), ','(nl, assert(player(Player))))))). display_game(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3))))) :- ','(nl, ','(write(' '), ','(write(R1C1), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R1C2), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R1C3), ','(write(' '), ','(tab(3), ','(write('u-l = upper left, u-c = upper center, u-r = upper right'), ','(nl, ','(write(' --+---+-- '), ','(nl, ','(write(' '), ','(write(R2C1), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R2C2), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R2C3), ','(write(' '), ','(tab(3), ','(write('c-l = center left, c-c = center center, c-r = center right'), ','(nl, ','(write(' --+---+-- '), ','(nl, ','(write(' '), ','(write(R3C1), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R3C2), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R3C3), ','(write(' '), ','(tab(3), ','(write('l-l = lower left, l-c = lower center, l-r = lower right'), ','(nl, nl))))))))))))))))))))))))))))))))))))))))))))))). next_player(Player, computer) :- player(Player). next_player(computer, Player1) :- player(Player1). legal(Position, Player, Move, Move) :- move(Position, Move). legal(Position, Player, Move1, Move) :- ','(write('Illegal move! '), ','(!, choose(Position, Player, Move))). game_over(Position, Player, ','(Player1, ' you win!')) :- ','(game_win_x(Position), player(Player1)). game_over(Position, Player, 'Computer wins!') :- game_win_o(Position). game_over(Position, Player, 'It is a tie!') :- game_tie(Position). game_tie(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3))))) :- ','(\+(game_win_x(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))), ','(\+(game_win_o(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))), ','(\==(R1C1, ' '), ','(\==(R1C2, ' '), ','(\==(R1C3, ' '), ','(\==(R2C1, ' '), ','(\==(R2C2, ' '), ','(\==(R2C3, ' '), ','(\==(R3C1, ' '), ','(\==(R3C2, ' '), \==(R3C3, ' '))))))))))). game_win_x(','(','(x, ','(x, x)), ','(','(X1, ','(X2, X3)), ','(X4, ','(X5, X6))))). game_win_x(','(','(X7, ','(X8, X9)), ','(','(x, ','(x, x)), ','(X10, ','(X11, X12))))). game_win_x(','(','(X13, ','(X14, X15)), ','(','(X16, ','(X17, X18)), ','(x, ','(x, x))))). game_win_x(','(','(x, ','(X19, X20)), ','(','(x, ','(X21, X22)), ','(x, ','(X23, X24))))). game_win_x(','(','(X25, ','(x, X26)), ','(','(X27, ','(x, X28)), ','(X29, ','(x, X30))))). game_win_x(','(','(X31, ','(X32, x)), ','(','(X33, ','(X34, x)), ','(X35, ','(X36, x))))). game_win_x(','(','(x, ','(X37, X38)), ','(','(X39, ','(x, X40)), ','(X41, ','(X42, x))))). game_win_x(','(','(X43, ','(X44, x)), ','(','(X45, ','(x, X46)), ','(x, ','(X47, X48))))). game_win_o(','(','(o, ','(o, o)), ','(','(X49, ','(X50, X51)), ','(X52, ','(X53, X54))))). game_win_o(','(','(X55, ','(X56, X57)), ','(','(o, ','(o, o)), ','(X58, ','(X59, X60))))). game_win_o(','(','(X61, ','(X62, X63)), ','(','(X64, ','(X65, X66)), ','(o, ','(o, o))))). game_win_o(','(','(o, ','(X67, X68)), ','(','(o, ','(X69, X70)), ','(o, ','(X71, X72))))). game_win_o(','(','(X73, ','(o, X74)), ','(','(X75, ','(o, X76)), ','(X77, ','(o, X78))))). game_win_o(','(','(X79, ','(X80, o)), ','(','(X81, ','(X82, o)), ','(X83, ','(X84, o))))). game_win_o(','(','(o, ','(X85, X86)), ','(','(X87, ','(o, X88)), ','(X89, ','(X90, o))))). game_win_o(','(','(X91, ','(X92, o)), ','(','(X93, ','(o, X94)), ','(o, ','(X95, X96))))). move(','(','(' ', ','(X97, X98)), ','(','(X99, ','(X100, X101)), ','(X102, ','(X103, X104)))), -(u, l)). move(','(','(X105, ','(' ', X106)), ','(','(X107, ','(X108, X109)), ','(X110, ','(X111, X112)))), -(u, c)). move(','(','(X113, ','(X114, ' ')), ','(','(X115, ','(X116, X117)), ','(X118, ','(X119, X120)))), -(u, r)). move(','(','(X121, ','(X122, X123)), ','(','(' ', ','(X124, X125)), ','(X126, ','(X127, X128)))), -(c, l)). move(','(','(X129, ','(X130, X131)), ','(','(X132, ','(' ', X133)), ','(X134, ','(X135, X136)))), -(c, c)). move(','(','(X137, ','(X138, X139)), ','(','(X140, ','(X141, ' ')), ','(X142, ','(X143, X144)))), -(c, r)). move(','(','(X145, ','(X146, X147)), ','(','(X148, ','(X149, X150)), ','(' ', ','(X151, X152)))), -(l, l)). move(','(','(X153, ','(X154, X155)), ','(','(X156, ','(X157, X158)), ','(X159, ','(' ', X160)))), -(l, c)). move(','(','(X161, ','(X162, X163)), ','(','(X164, ','(X165, X166)), ','(X167, ','(X168, ' ')))), -(l, r)). move(-(u, l), computer, Position, Position1) :- ','(=(','(','(X169, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(o, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(u, c), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(X170, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(o, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(u, r), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, X171)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, o)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, l), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(X172, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(o, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, c), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(X173, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(o, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, r), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, X174)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, o)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(l, l), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(X175, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(o, ','(R3C2, R3C3)))))). move(-(l, c), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(X176, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(o, R3C3)))))). move(-(l, r), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, X177)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, o)))))). move(-(u, l), Player, Position, Position1) :- ','(=(','(','(X178, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(x, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(u, c), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(X179, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(x, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(u, r), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, X180)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, x)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, l), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(X181, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(x, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, c), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(X182, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(x, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, r), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, X183)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, x)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(l, l), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(X184, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(x, ','(R3C2, R3C3)))))). move(-(l, c), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(X185, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(x, R3C3)))))). move(-(l, r), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, X186)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, x)))))). Directives: :- entry(play(Game), .(ground(Game), [])). :- trust(player(Player), [], .(ground(Player), [])). :- trust(abolish0(Player), [], .(ground(Player), [])). Query: play(g,g,a) ---------------------------------------- (1) NotTransformerProof (EQUIVALENT) Transformed all not-constructs [PROLOG]. ---------------------------------------- (2) Obligation: Clauses: play(Game) :- ','(initialize(Game, Position, Player), ','(display_game(Position), play(Position, Player, Result))). play(Position, Player, Result) :- ','(game_over(Position, Player, Result), ','(!, ','(write(Result), abolish0(player)))). play(Position, Player, Result) :- ','(choose(Position, Player, Move), ','(move(Move, Player, Position, Position1), ','(display_game(Position1), ','(next_player(Player, Player1), ','(!, play(Position1, Player1, Result)))))). choose(Position, computer, Move) :- ','(write('Computer is thinking...'), ','(nl, alpha_beta(computer, Position, -1, 1, Move, Value))). choose(Position, Player, Move) :- ','(write(Player), ','(write(', enter move (followed by a period and return) --> '), ','(read(Move1), legal(Position, Player, Move1, Move)))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(==(Player, computer), ','(game_win_o(Position), is(Value, 1))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(player(Player), ','(game_win_x(Position), is(Value, 1))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(game_tie(Position), is(Value, 0)). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(==(Player, computer), ','(game_win_x(Position), is(Value, -1))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(player(Player), ','(game_win_o(Position), is(Value, -1))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(setof(Move1, move(Position, Move1), Moves), ','(is(Alpha1, -(Beta)), ','(is(Beta1, -(Alpha)), evaluate(Player, Moves, Position, Alpha1, Beta1, nil, ','(Move, Value))))). evaluate(Player, .(Move, Moves), Position, Alpha, Beta, Move1, Best) :- ','(move(Move, Player, Position, Position1), ','(next_player(Player, Player1), ','(alpha_beta(Player1, Position1, Alpha, Beta, MoveX, Value), ','(is(Value1, -(Value)), ','(cutoff(Player, Move, Value1, Alpha, Beta, Moves, Position, Move1, Best), !))))). evaluate(Player, [], Position, Alpha, Beta, Move, ','(Move, Alpha)). cutoff(Player, Move, Value, Alpha, Beta, Moves, Position, Move1, ','(Move, Value)) :- ','(>=(Value, Beta), !). cutoff(Player, Move, Value, Alpha, Beta, Moves, Position, Move1, Best) :- ','(<(Alpha, Value), ','(<(Value, Beta), ','(!, evaluate(Player, Moves, Position, Value, Beta, Move, Best)))). cutoff(Player, Move, Value, Alpha, Beta, Moves, Position, Move1, Best) :- ','(=<(Value, Alpha), ','(!, evaluate(Player, Moves, Position, Alpha, Beta, Move1, Best))). initialize(tictactoe, ','(','(' ', ','(' ', ' ')), ','(','(' ', ','(' ', ' ')), ','(' ', ','(' ', ' ')))), Player) :- ','(write('Enter player`s name (followed by a period and return) --> '), ','(read(Player), ','(write(Player), ','(write(', you will go first and use the symbol "x".'), ','(nl, assert(player(Player))))))). display_game(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3))))) :- ','(nl, ','(write(' '), ','(write(R1C1), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R1C2), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R1C3), ','(write(' '), ','(tab(3), ','(write('u-l = upper left, u-c = upper center, u-r = upper right'), ','(nl, ','(write(' --+---+-- '), ','(nl, ','(write(' '), ','(write(R2C1), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R2C2), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R2C3), ','(write(' '), ','(tab(3), ','(write('c-l = center left, c-c = center center, c-r = center right'), ','(nl, ','(write(' --+---+-- '), ','(nl, ','(write(' '), ','(write(R3C1), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R3C2), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R3C3), ','(write(' '), ','(tab(3), ','(write('l-l = lower left, l-c = lower center, l-r = lower right'), ','(nl, nl))))))))))))))))))))))))))))))))))))))))))))))). next_player(Player, computer) :- player(Player). next_player(computer, Player1) :- player(Player1). legal(Position, Player, Move, Move) :- move(Position, Move). legal(Position, Player, Move1, Move) :- ','(write('Illegal move! '), ','(!, choose(Position, Player, Move))). game_over(Position, Player, ','(Player1, ' you win!')) :- ','(game_win_x(Position), player(Player1)). game_over(Position, Player, 'Computer wins!') :- game_win_o(Position). game_over(Position, Player, 'It is a tie!') :- game_tie(Position). game_tie(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3))))) :- ','(not(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3), ','(not1(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3), ','(\==(R1C1, ' '), ','(\==(R1C2, ' '), ','(\==(R1C3, ' '), ','(\==(R2C1, ' '), ','(\==(R2C2, ' '), ','(\==(R2C3, ' '), ','(\==(R3C1, ' '), ','(\==(R3C2, ' '), \==(R3C3, ' '))))))))))). game_win_x(','(','(x, ','(x, x)), ','(','(X1, ','(X2, X3)), ','(X4, ','(X5, X6))))). game_win_x(','(','(X7, ','(X8, X9)), ','(','(x, ','(x, x)), ','(X10, ','(X11, X12))))). game_win_x(','(','(X13, ','(X14, X15)), ','(','(X16, ','(X17, X18)), ','(x, ','(x, x))))). game_win_x(','(','(x, ','(X19, X20)), ','(','(x, ','(X21, X22)), ','(x, ','(X23, X24))))). game_win_x(','(','(X25, ','(x, X26)), ','(','(X27, ','(x, X28)), ','(X29, ','(x, X30))))). game_win_x(','(','(X31, ','(X32, x)), ','(','(X33, ','(X34, x)), ','(X35, ','(X36, x))))). game_win_x(','(','(x, ','(X37, X38)), ','(','(X39, ','(x, X40)), ','(X41, ','(X42, x))))). game_win_x(','(','(X43, ','(X44, x)), ','(','(X45, ','(x, X46)), ','(x, ','(X47, X48))))). game_win_o(','(','(o, ','(o, o)), ','(','(X49, ','(X50, X51)), ','(X52, ','(X53, X54))))). game_win_o(','(','(X55, ','(X56, X57)), ','(','(o, ','(o, o)), ','(X58, ','(X59, X60))))). game_win_o(','(','(X61, ','(X62, X63)), ','(','(X64, ','(X65, X66)), ','(o, ','(o, o))))). game_win_o(','(','(o, ','(X67, X68)), ','(','(o, ','(X69, X70)), ','(o, ','(X71, X72))))). game_win_o(','(','(X73, ','(o, X74)), ','(','(X75, ','(o, X76)), ','(X77, ','(o, X78))))). game_win_o(','(','(X79, ','(X80, o)), ','(','(X81, ','(X82, o)), ','(X83, ','(X84, o))))). game_win_o(','(','(o, ','(X85, X86)), ','(','(X87, ','(o, X88)), ','(X89, ','(X90, o))))). game_win_o(','(','(X91, ','(X92, o)), ','(','(X93, ','(o, X94)), ','(o, ','(X95, X96))))). move(','(','(' ', ','(X97, X98)), ','(','(X99, ','(X100, X101)), ','(X102, ','(X103, X104)))), -(u, l)). move(','(','(X105, ','(' ', X106)), ','(','(X107, ','(X108, X109)), ','(X110, ','(X111, X112)))), -(u, c)). move(','(','(X113, ','(X114, ' ')), ','(','(X115, ','(X116, X117)), ','(X118, ','(X119, X120)))), -(u, r)). move(','(','(X121, ','(X122, X123)), ','(','(' ', ','(X124, X125)), ','(X126, ','(X127, X128)))), -(c, l)). move(','(','(X129, ','(X130, X131)), ','(','(X132, ','(' ', X133)), ','(X134, ','(X135, X136)))), -(c, c)). move(','(','(X137, ','(X138, X139)), ','(','(X140, ','(X141, ' ')), ','(X142, ','(X143, X144)))), -(c, r)). move(','(','(X145, ','(X146, X147)), ','(','(X148, ','(X149, X150)), ','(' ', ','(X151, X152)))), -(l, l)). move(','(','(X153, ','(X154, X155)), ','(','(X156, ','(X157, X158)), ','(X159, ','(' ', X160)))), -(l, c)). move(','(','(X161, ','(X162, X163)), ','(','(X164, ','(X165, X166)), ','(X167, ','(X168, ' ')))), -(l, r)). move(-(u, l), computer, Position, Position1) :- ','(=(','(','(X169, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(o, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(u, c), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(X170, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(o, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(u, r), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, X171)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, o)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, l), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(X172, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(o, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, c), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(X173, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(o, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, r), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, X174)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, o)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(l, l), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(X175, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(o, ','(R3C2, R3C3)))))). move(-(l, c), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(X176, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(o, R3C3)))))). move(-(l, r), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, X177)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, o)))))). move(-(u, l), Player, Position, Position1) :- ','(=(','(','(X178, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(x, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(u, c), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(X179, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(x, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(u, r), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, X180)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, x)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, l), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(X181, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(x, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, c), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(X182, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(x, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, r), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, X183)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, x)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(l, l), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(X184, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(x, ','(R3C2, R3C3)))))). move(-(l, c), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(X185, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(x, R3C3)))))). move(-(l, r), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, X186)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, x)))))). not(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3) :- ','(call(game_win_x(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))), ','(!, fail)). not(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3). not1(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3) :- ','(call(game_win_o(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))), ','(!, fail)). not1(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3). Directives: :- entry(play(Game), .(ground(Game), [])). :- trust(player(Player), [], .(ground(Player), [])). :- trust(abolish0(Player), [], .(ground(Player), [])). Query: play(g,g,a) ---------------------------------------- (3) CallTransformerProof (EQUIVALENT) Transformed all call-constructs [PROLOG]. ---------------------------------------- (4) Obligation: Clauses: play(Game) :- ','(initialize(Game, Position, Player), ','(display_game(Position), play(Position, Player, Result))). play(Position, Player, Result) :- ','(game_over(Position, Player, Result), ','(!, ','(write(Result), abolish0(player)))). play(Position, Player, Result) :- ','(choose(Position, Player, Move), ','(move(Move, Player, Position, Position1), ','(display_game(Position1), ','(next_player(Player, Player1), ','(!, play(Position1, Player1, Result)))))). choose(Position, computer, Move) :- ','(write('Computer is thinking...'), ','(nl, alpha_beta(computer, Position, -1, 1, Move, Value))). choose(Position, Player, Move) :- ','(write(Player), ','(write(', enter move (followed by a period and return) --> '), ','(read(Move1), legal(Position, Player, Move1, Move)))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(==(Player, computer), ','(game_win_o(Position), is(Value, 1))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(player(Player), ','(game_win_x(Position), is(Value, 1))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(game_tie(Position), is(Value, 0)). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(==(Player, computer), ','(game_win_x(Position), is(Value, -1))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(player(Player), ','(game_win_o(Position), is(Value, -1))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(setof(Move1, move(Position, Move1), Moves), ','(is(Alpha1, -(Beta)), ','(is(Beta1, -(Alpha)), evaluate(Player, Moves, Position, Alpha1, Beta1, nil, ','(Move, Value))))). evaluate(Player, .(Move, Moves), Position, Alpha, Beta, Move1, Best) :- ','(move(Move, Player, Position, Position1), ','(next_player(Player, Player1), ','(alpha_beta(Player1, Position1, Alpha, Beta, MoveX, Value), ','(is(Value1, -(Value)), ','(cutoff(Player, Move, Value1, Alpha, Beta, Moves, Position, Move1, Best), !))))). evaluate(Player, [], Position, Alpha, Beta, Move, ','(Move, Alpha)). cutoff(Player, Move, Value, Alpha, Beta, Moves, Position, Move1, ','(Move, Value)) :- ','(>=(Value, Beta), !). cutoff(Player, Move, Value, Alpha, Beta, Moves, Position, Move1, Best) :- ','(<(Alpha, Value), ','(<(Value, Beta), ','(!, evaluate(Player, Moves, Position, Value, Beta, Move, Best)))). cutoff(Player, Move, Value, Alpha, Beta, Moves, Position, Move1, Best) :- ','(=<(Value, Alpha), ','(!, evaluate(Player, Moves, Position, Alpha, Beta, Move1, Best))). initialize(tictactoe, ','(','(' ', ','(' ', ' ')), ','(','(' ', ','(' ', ' ')), ','(' ', ','(' ', ' ')))), Player) :- ','(write('Enter player`s name (followed by a period and return) --> '), ','(read(Player), ','(write(Player), ','(write(', you will go first and use the symbol "x".'), ','(nl, assert(player(Player))))))). display_game(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3))))) :- ','(nl, ','(write(' '), ','(write(R1C1), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R1C2), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R1C3), ','(write(' '), ','(tab(3), ','(write('u-l = upper left, u-c = upper center, u-r = upper right'), ','(nl, ','(write(' --+---+-- '), ','(nl, ','(write(' '), ','(write(R2C1), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R2C2), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R2C3), ','(write(' '), ','(tab(3), ','(write('c-l = center left, c-c = center center, c-r = center right'), ','(nl, ','(write(' --+---+-- '), ','(nl, ','(write(' '), ','(write(R3C1), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R3C2), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R3C3), ','(write(' '), ','(tab(3), ','(write('l-l = lower left, l-c = lower center, l-r = lower right'), ','(nl, nl))))))))))))))))))))))))))))))))))))))))))))))). next_player(Player, computer) :- player(Player). next_player(computer, Player1) :- player(Player1). legal(Position, Player, Move, Move) :- move(Position, Move). legal(Position, Player, Move1, Move) :- ','(write('Illegal move! '), ','(!, choose(Position, Player, Move))). game_over(Position, Player, ','(Player1, ' you win!')) :- ','(game_win_x(Position), player(Player1)). game_over(Position, Player, 'Computer wins!') :- game_win_o(Position). game_over(Position, Player, 'It is a tie!') :- game_tie(Position). game_tie(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3))))) :- ','(not(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3), ','(not1(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3), ','(\==(R1C1, ' '), ','(\==(R1C2, ' '), ','(\==(R1C3, ' '), ','(\==(R2C1, ' '), ','(\==(R2C2, ' '), ','(\==(R2C3, ' '), ','(\==(R3C1, ' '), ','(\==(R3C2, ' '), \==(R3C3, ' '))))))))))). game_win_x(','(','(x, ','(x, x)), ','(','(X1, ','(X2, X3)), ','(X4, ','(X5, X6))))). game_win_x(','(','(X7, ','(X8, X9)), ','(','(x, ','(x, x)), ','(X10, ','(X11, X12))))). game_win_x(','(','(X13, ','(X14, X15)), ','(','(X16, ','(X17, X18)), ','(x, ','(x, x))))). game_win_x(','(','(x, ','(X19, X20)), ','(','(x, ','(X21, X22)), ','(x, ','(X23, X24))))). game_win_x(','(','(X25, ','(x, X26)), ','(','(X27, ','(x, X28)), ','(X29, ','(x, X30))))). game_win_x(','(','(X31, ','(X32, x)), ','(','(X33, ','(X34, x)), ','(X35, ','(X36, x))))). game_win_x(','(','(x, ','(X37, X38)), ','(','(X39, ','(x, X40)), ','(X41, ','(X42, x))))). game_win_x(','(','(X43, ','(X44, x)), ','(','(X45, ','(x, X46)), ','(x, ','(X47, X48))))). game_win_o(','(','(o, ','(o, o)), ','(','(X49, ','(X50, X51)), ','(X52, ','(X53, X54))))). game_win_o(','(','(X55, ','(X56, X57)), ','(','(o, ','(o, o)), ','(X58, ','(X59, X60))))). game_win_o(','(','(X61, ','(X62, X63)), ','(','(X64, ','(X65, X66)), ','(o, ','(o, o))))). game_win_o(','(','(o, ','(X67, X68)), ','(','(o, ','(X69, X70)), ','(o, ','(X71, X72))))). game_win_o(','(','(X73, ','(o, X74)), ','(','(X75, ','(o, X76)), ','(X77, ','(o, X78))))). game_win_o(','(','(X79, ','(X80, o)), ','(','(X81, ','(X82, o)), ','(X83, ','(X84, o))))). game_win_o(','(','(o, ','(X85, X86)), ','(','(X87, ','(o, X88)), ','(X89, ','(X90, o))))). game_win_o(','(','(X91, ','(X92, o)), ','(','(X93, ','(o, X94)), ','(o, ','(X95, X96))))). move(','(','(' ', ','(X97, X98)), ','(','(X99, ','(X100, X101)), ','(X102, ','(X103, X104)))), -(u, l)). move(','(','(X105, ','(' ', X106)), ','(','(X107, ','(X108, X109)), ','(X110, ','(X111, X112)))), -(u, c)). move(','(','(X113, ','(X114, ' ')), ','(','(X115, ','(X116, X117)), ','(X118, ','(X119, X120)))), -(u, r)). move(','(','(X121, ','(X122, X123)), ','(','(' ', ','(X124, X125)), ','(X126, ','(X127, X128)))), -(c, l)). move(','(','(X129, ','(X130, X131)), ','(','(X132, ','(' ', X133)), ','(X134, ','(X135, X136)))), -(c, c)). move(','(','(X137, ','(X138, X139)), ','(','(X140, ','(X141, ' ')), ','(X142, ','(X143, X144)))), -(c, r)). move(','(','(X145, ','(X146, X147)), ','(','(X148, ','(X149, X150)), ','(' ', ','(X151, X152)))), -(l, l)). move(','(','(X153, ','(X154, X155)), ','(','(X156, ','(X157, X158)), ','(X159, ','(' ', X160)))), -(l, c)). move(','(','(X161, ','(X162, X163)), ','(','(X164, ','(X165, X166)), ','(X167, ','(X168, ' ')))), -(l, r)). move(-(u, l), computer, Position, Position1) :- ','(=(','(','(X169, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(o, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(u, c), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(X170, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(o, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(u, r), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, X171)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, o)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, l), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(X172, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(o, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, c), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(X173, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(o, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, r), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, X174)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, o)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(l, l), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(X175, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(o, ','(R3C2, R3C3)))))). move(-(l, c), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(X176, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(o, R3C3)))))). move(-(l, r), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, X177)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, o)))))). move(-(u, l), Player, Position, Position1) :- ','(=(','(','(X178, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(x, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(u, c), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(X179, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(x, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(u, r), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, X180)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, x)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, l), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(X181, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(x, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, c), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(X182, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(x, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, r), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, X183)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, x)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(l, l), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(X184, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(x, ','(R3C2, R3C3)))))). move(-(l, c), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(X185, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(x, R3C3)))))). move(-(l, r), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, X186)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, x)))))). not(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3) :- ','(call1(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3), ','(!, fail)). not(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3). not1(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3) :- ','(call2(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3), ','(!, fail)). not1(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3). call1(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3) :- game_win_x(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3))))). call2(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3) :- game_win_o(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3))))). Directives: :- entry(play(Game), .(ground(Game), [])). :- trust(player(Player), [], .(ground(Player), [])). :- trust(abolish0(Player), [], .(ground(Player), [])). Query: play(g,g,a) ---------------------------------------- (5) CutEliminatorProof (SOUND) Eliminated all cuts by simply ignoring them[PROLOG]. ---------------------------------------- (6) Obligation: Clauses: play(Game) :- ','(initialize(Game, Position, Player), ','(display_game(Position), play(Position, Player, Result))). play(Position, Player, Result) :- ','(game_over(Position, Player, Result), ','(write(Result), abolish0(player))). play(Position, Player, Result) :- ','(choose(Position, Player, Move), ','(move(Move, Player, Position, Position1), ','(display_game(Position1), ','(next_player(Player, Player1), play(Position1, Player1, Result))))). choose(Position, computer, Move) :- ','(write('Computer is thinking...'), ','(nl, alpha_beta(computer, Position, -1, 1, Move, Value))). choose(Position, Player, Move) :- ','(write(Player), ','(write(', enter move (followed by a period and return) --> '), ','(read(Move1), legal(Position, Player, Move1, Move)))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(==(Player, computer), ','(game_win_o(Position), is(Value, 1))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(player(Player), ','(game_win_x(Position), is(Value, 1))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(game_tie(Position), is(Value, 0)). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(==(Player, computer), ','(game_win_x(Position), is(Value, -1))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(player(Player), ','(game_win_o(Position), is(Value, -1))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(setof(Move1, move(Position, Move1), Moves), ','(is(Alpha1, -(Beta)), ','(is(Beta1, -(Alpha)), evaluate(Player, Moves, Position, Alpha1, Beta1, nil, ','(Move, Value))))). evaluate(Player, .(Move, Moves), Position, Alpha, Beta, Move1, Best) :- ','(move(Move, Player, Position, Position1), ','(next_player(Player, Player1), ','(alpha_beta(Player1, Position1, Alpha, Beta, MoveX, Value), ','(is(Value1, -(Value)), cutoff(Player, Move, Value1, Alpha, Beta, Moves, Position, Move1, Best))))). evaluate(Player, [], Position, Alpha, Beta, Move, ','(Move, Alpha)). cutoff(Player, Move, Value, Alpha, Beta, Moves, Position, Move1, ','(Move, Value)) :- >=(Value, Beta). cutoff(Player, Move, Value, Alpha, Beta, Moves, Position, Move1, Best) :- ','(<(Alpha, Value), ','(<(Value, Beta), evaluate(Player, Moves, Position, Value, Beta, Move, Best))). cutoff(Player, Move, Value, Alpha, Beta, Moves, Position, Move1, Best) :- ','(=<(Value, Alpha), evaluate(Player, Moves, Position, Alpha, Beta, Move1, Best)). initialize(tictactoe, ','(','(' ', ','(' ', ' ')), ','(','(' ', ','(' ', ' ')), ','(' ', ','(' ', ' ')))), Player) :- ','(write('Enter player`s name (followed by a period and return) --> '), ','(read(Player), ','(write(Player), ','(write(', you will go first and use the symbol "x".'), ','(nl, assert(player(Player))))))). display_game(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3))))) :- ','(nl, ','(write(' '), ','(write(R1C1), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R1C2), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R1C3), ','(write(' '), ','(tab(3), ','(write('u-l = upper left, u-c = upper center, u-r = upper right'), ','(nl, ','(write(' --+---+-- '), ','(nl, ','(write(' '), ','(write(R2C1), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R2C2), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R2C3), ','(write(' '), ','(tab(3), ','(write('c-l = center left, c-c = center center, c-r = center right'), ','(nl, ','(write(' --+---+-- '), ','(nl, ','(write(' '), ','(write(R3C1), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R3C2), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R3C3), ','(write(' '), ','(tab(3), ','(write('l-l = lower left, l-c = lower center, l-r = lower right'), ','(nl, nl))))))))))))))))))))))))))))))))))))))))))))))). next_player(Player, computer) :- player(Player). next_player(computer, Player1) :- player(Player1). legal(Position, Player, Move, Move) :- move(Position, Move). legal(Position, Player, Move1, Move) :- ','(write('Illegal move! '), choose(Position, Player, Move)). game_over(Position, Player, ','(Player1, ' you win!')) :- ','(game_win_x(Position), player(Player1)). game_over(Position, Player, 'Computer wins!') :- game_win_o(Position). game_over(Position, Player, 'It is a tie!') :- game_tie(Position). game_tie(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3))))) :- ','(not(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3), ','(not1(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3), ','(\==(R1C1, ' '), ','(\==(R1C2, ' '), ','(\==(R1C3, ' '), ','(\==(R2C1, ' '), ','(\==(R2C2, ' '), ','(\==(R2C3, ' '), ','(\==(R3C1, ' '), ','(\==(R3C2, ' '), \==(R3C3, ' '))))))))))). game_win_x(','(','(x, ','(x, x)), ','(','(X1, ','(X2, X3)), ','(X4, ','(X5, X6))))). game_win_x(','(','(X7, ','(X8, X9)), ','(','(x, ','(x, x)), ','(X10, ','(X11, X12))))). game_win_x(','(','(X13, ','(X14, X15)), ','(','(X16, ','(X17, X18)), ','(x, ','(x, x))))). game_win_x(','(','(x, ','(X19, X20)), ','(','(x, ','(X21, X22)), ','(x, ','(X23, X24))))). game_win_x(','(','(X25, ','(x, X26)), ','(','(X27, ','(x, X28)), ','(X29, ','(x, X30))))). game_win_x(','(','(X31, ','(X32, x)), ','(','(X33, ','(X34, x)), ','(X35, ','(X36, x))))). game_win_x(','(','(x, ','(X37, X38)), ','(','(X39, ','(x, X40)), ','(X41, ','(X42, x))))). game_win_x(','(','(X43, ','(X44, x)), ','(','(X45, ','(x, X46)), ','(x, ','(X47, X48))))). game_win_o(','(','(o, ','(o, o)), ','(','(X49, ','(X50, X51)), ','(X52, ','(X53, X54))))). game_win_o(','(','(X55, ','(X56, X57)), ','(','(o, ','(o, o)), ','(X58, ','(X59, X60))))). game_win_o(','(','(X61, ','(X62, X63)), ','(','(X64, ','(X65, X66)), ','(o, ','(o, o))))). game_win_o(','(','(o, ','(X67, X68)), ','(','(o, ','(X69, X70)), ','(o, ','(X71, X72))))). game_win_o(','(','(X73, ','(o, X74)), ','(','(X75, ','(o, X76)), ','(X77, ','(o, X78))))). game_win_o(','(','(X79, ','(X80, o)), ','(','(X81, ','(X82, o)), ','(X83, ','(X84, o))))). game_win_o(','(','(o, ','(X85, X86)), ','(','(X87, ','(o, X88)), ','(X89, ','(X90, o))))). game_win_o(','(','(X91, ','(X92, o)), ','(','(X93, ','(o, X94)), ','(o, ','(X95, X96))))). move(','(','(' ', ','(X97, X98)), ','(','(X99, ','(X100, X101)), ','(X102, ','(X103, X104)))), -(u, l)). move(','(','(X105, ','(' ', X106)), ','(','(X107, ','(X108, X109)), ','(X110, ','(X111, X112)))), -(u, c)). move(','(','(X113, ','(X114, ' ')), ','(','(X115, ','(X116, X117)), ','(X118, ','(X119, X120)))), -(u, r)). move(','(','(X121, ','(X122, X123)), ','(','(' ', ','(X124, X125)), ','(X126, ','(X127, X128)))), -(c, l)). move(','(','(X129, ','(X130, X131)), ','(','(X132, ','(' ', X133)), ','(X134, ','(X135, X136)))), -(c, c)). move(','(','(X137, ','(X138, X139)), ','(','(X140, ','(X141, ' ')), ','(X142, ','(X143, X144)))), -(c, r)). move(','(','(X145, ','(X146, X147)), ','(','(X148, ','(X149, X150)), ','(' ', ','(X151, X152)))), -(l, l)). move(','(','(X153, ','(X154, X155)), ','(','(X156, ','(X157, X158)), ','(X159, ','(' ', X160)))), -(l, c)). move(','(','(X161, ','(X162, X163)), ','(','(X164, ','(X165, X166)), ','(X167, ','(X168, ' ')))), -(l, r)). move(-(u, l), computer, Position, Position1) :- ','(=(','(','(X169, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(o, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(u, c), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(X170, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(o, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(u, r), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, X171)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, o)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, l), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(X172, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(o, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, c), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(X173, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(o, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, r), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, X174)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, o)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(l, l), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(X175, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(o, ','(R3C2, R3C3)))))). move(-(l, c), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(X176, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(o, R3C3)))))). move(-(l, r), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, X177)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, o)))))). move(-(u, l), Player, Position, Position1) :- ','(=(','(','(X178, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(x, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(u, c), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(X179, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(x, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(u, r), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, X180)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, x)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, l), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(X181, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(x, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, c), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(X182, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(x, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, r), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, X183)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, x)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(l, l), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(X184, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(x, ','(R3C2, R3C3)))))). move(-(l, c), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(X185, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(x, R3C3)))))). move(-(l, r), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, X186)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, x)))))). not(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3) :- ','(call1(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3), fail). not(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3). not1(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3) :- ','(call2(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3), fail). not1(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3). call1(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3) :- game_win_x(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3))))). call2(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3) :- game_win_o(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3))))). Directives: :- entry(play(Game), .(ground(Game), [])). :- trust(player(Player), [], .(ground(Player), [])). :- trust(abolish0(Player), [], .(ground(Player), [])). Query: play(g,g,a) ---------------------------------------- (7) FailTransformerProof (EQUIVALENT) Added clauses for the built-in fail predicate [PROLOG]. ---------------------------------------- (8) Obligation: Clauses: play(Game) :- ','(initialize(Game, Position, Player), ','(display_game(Position), play(Position, Player, Result))). play(Position, Player, Result) :- ','(game_over(Position, Player, Result), ','(write(Result), abolish0(player))). play(Position, Player, Result) :- ','(choose(Position, Player, Move), ','(move(Move, Player, Position, Position1), ','(display_game(Position1), ','(next_player(Player, Player1), play(Position1, Player1, Result))))). choose(Position, computer, Move) :- ','(write('Computer is thinking...'), ','(nl, alpha_beta(computer, Position, -1, 1, Move, Value))). choose(Position, Player, Move) :- ','(write(Player), ','(write(', enter move (followed by a period and return) --> '), ','(read(Move1), legal(Position, Player, Move1, Move)))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(==(Player, computer), ','(game_win_o(Position), is(Value, 1))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(player(Player), ','(game_win_x(Position), is(Value, 1))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(game_tie(Position), is(Value, 0)). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(==(Player, computer), ','(game_win_x(Position), is(Value, -1))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(player(Player), ','(game_win_o(Position), is(Value, -1))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(setof(Move1, move(Position, Move1), Moves), ','(is(Alpha1, -(Beta)), ','(is(Beta1, -(Alpha)), evaluate(Player, Moves, Position, Alpha1, Beta1, nil, ','(Move, Value))))). evaluate(Player, .(Move, Moves), Position, Alpha, Beta, Move1, Best) :- ','(move(Move, Player, Position, Position1), ','(next_player(Player, Player1), ','(alpha_beta(Player1, Position1, Alpha, Beta, MoveX, Value), ','(is(Value1, -(Value)), cutoff(Player, Move, Value1, Alpha, Beta, Moves, Position, Move1, Best))))). evaluate(Player, [], Position, Alpha, Beta, Move, ','(Move, Alpha)). cutoff(Player, Move, Value, Alpha, Beta, Moves, Position, Move1, ','(Move, Value)) :- >=(Value, Beta). cutoff(Player, Move, Value, Alpha, Beta, Moves, Position, Move1, Best) :- ','(<(Alpha, Value), ','(<(Value, Beta), evaluate(Player, Moves, Position, Value, Beta, Move, Best))). cutoff(Player, Move, Value, Alpha, Beta, Moves, Position, Move1, Best) :- ','(=<(Value, Alpha), evaluate(Player, Moves, Position, Alpha, Beta, Move1, Best)). initialize(tictactoe, ','(','(' ', ','(' ', ' ')), ','(','(' ', ','(' ', ' ')), ','(' ', ','(' ', ' ')))), Player) :- ','(write('Enter player`s name (followed by a period and return) --> '), ','(read(Player), ','(write(Player), ','(write(', you will go first and use the symbol "x".'), ','(nl, assert(player(Player))))))). display_game(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3))))) :- ','(nl, ','(write(' '), ','(write(R1C1), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R1C2), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R1C3), ','(write(' '), ','(tab(3), ','(write('u-l = upper left, u-c = upper center, u-r = upper right'), ','(nl, ','(write(' --+---+-- '), ','(nl, ','(write(' '), ','(write(R2C1), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R2C2), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R2C3), ','(write(' '), ','(tab(3), ','(write('c-l = center left, c-c = center center, c-r = center right'), ','(nl, ','(write(' --+---+-- '), ','(nl, ','(write(' '), ','(write(R3C1), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R3C2), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R3C3), ','(write(' '), ','(tab(3), ','(write('l-l = lower left, l-c = lower center, l-r = lower right'), ','(nl, nl))))))))))))))))))))))))))))))))))))))))))))))). next_player(Player, computer) :- player(Player). next_player(computer, Player1) :- player(Player1). legal(Position, Player, Move, Move) :- move(Position, Move). legal(Position, Player, Move1, Move) :- ','(write('Illegal move! '), choose(Position, Player, Move)). game_over(Position, Player, ','(Player1, ' you win!')) :- ','(game_win_x(Position), player(Player1)). game_over(Position, Player, 'Computer wins!') :- game_win_o(Position). game_over(Position, Player, 'It is a tie!') :- game_tie(Position). game_tie(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3))))) :- ','(not(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3), ','(not1(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3), ','(\==(R1C1, ' '), ','(\==(R1C2, ' '), ','(\==(R1C3, ' '), ','(\==(R2C1, ' '), ','(\==(R2C2, ' '), ','(\==(R2C3, ' '), ','(\==(R3C1, ' '), ','(\==(R3C2, ' '), \==(R3C3, ' '))))))))))). game_win_x(','(','(x, ','(x, x)), ','(','(X1, ','(X2, X3)), ','(X4, ','(X5, X6))))). game_win_x(','(','(X7, ','(X8, X9)), ','(','(x, ','(x, x)), ','(X10, ','(X11, X12))))). game_win_x(','(','(X13, ','(X14, X15)), ','(','(X16, ','(X17, X18)), ','(x, ','(x, x))))). game_win_x(','(','(x, ','(X19, X20)), ','(','(x, ','(X21, X22)), ','(x, ','(X23, X24))))). game_win_x(','(','(X25, ','(x, X26)), ','(','(X27, ','(x, X28)), ','(X29, ','(x, X30))))). game_win_x(','(','(X31, ','(X32, x)), ','(','(X33, ','(X34, x)), ','(X35, ','(X36, x))))). game_win_x(','(','(x, ','(X37, X38)), ','(','(X39, ','(x, X40)), ','(X41, ','(X42, x))))). game_win_x(','(','(X43, ','(X44, x)), ','(','(X45, ','(x, X46)), ','(x, ','(X47, X48))))). game_win_o(','(','(o, ','(o, o)), ','(','(X49, ','(X50, X51)), ','(X52, ','(X53, X54))))). game_win_o(','(','(X55, ','(X56, X57)), ','(','(o, ','(o, o)), ','(X58, ','(X59, X60))))). game_win_o(','(','(X61, ','(X62, X63)), ','(','(X64, ','(X65, X66)), ','(o, ','(o, o))))). game_win_o(','(','(o, ','(X67, X68)), ','(','(o, ','(X69, X70)), ','(o, ','(X71, X72))))). game_win_o(','(','(X73, ','(o, X74)), ','(','(X75, ','(o, X76)), ','(X77, ','(o, X78))))). game_win_o(','(','(X79, ','(X80, o)), ','(','(X81, ','(X82, o)), ','(X83, ','(X84, o))))). game_win_o(','(','(o, ','(X85, X86)), ','(','(X87, ','(o, X88)), ','(X89, ','(X90, o))))). game_win_o(','(','(X91, ','(X92, o)), ','(','(X93, ','(o, X94)), ','(o, ','(X95, X96))))). move(','(','(' ', ','(X97, X98)), ','(','(X99, ','(X100, X101)), ','(X102, ','(X103, X104)))), -(u, l)). move(','(','(X105, ','(' ', X106)), ','(','(X107, ','(X108, X109)), ','(X110, ','(X111, X112)))), -(u, c)). move(','(','(X113, ','(X114, ' ')), ','(','(X115, ','(X116, X117)), ','(X118, ','(X119, X120)))), -(u, r)). move(','(','(X121, ','(X122, X123)), ','(','(' ', ','(X124, X125)), ','(X126, ','(X127, X128)))), -(c, l)). move(','(','(X129, ','(X130, X131)), ','(','(X132, ','(' ', X133)), ','(X134, ','(X135, X136)))), -(c, c)). move(','(','(X137, ','(X138, X139)), ','(','(X140, ','(X141, ' ')), ','(X142, ','(X143, X144)))), -(c, r)). move(','(','(X145, ','(X146, X147)), ','(','(X148, ','(X149, X150)), ','(' ', ','(X151, X152)))), -(l, l)). move(','(','(X153, ','(X154, X155)), ','(','(X156, ','(X157, X158)), ','(X159, ','(' ', X160)))), -(l, c)). move(','(','(X161, ','(X162, X163)), ','(','(X164, ','(X165, X166)), ','(X167, ','(X168, ' ')))), -(l, r)). move(-(u, l), computer, Position, Position1) :- ','(=(','(','(X169, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(o, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(u, c), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(X170, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(o, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(u, r), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, X171)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, o)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, l), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(X172, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(o, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, c), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(X173, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(o, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, r), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, X174)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, o)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(l, l), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(X175, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(o, ','(R3C2, R3C3)))))). move(-(l, c), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(X176, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(o, R3C3)))))). move(-(l, r), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, X177)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, o)))))). move(-(u, l), Player, Position, Position1) :- ','(=(','(','(X178, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(x, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(u, c), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(X179, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(x, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(u, r), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, X180)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, x)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, l), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(X181, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(x, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, c), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(X182, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(x, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, r), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, X183)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, x)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(l, l), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(X184, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(x, ','(R3C2, R3C3)))))). move(-(l, c), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(X185, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(x, R3C3)))))). move(-(l, r), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, X186)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, x)))))). not(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3) :- ','(call1(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3), fail). not(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3). not1(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3) :- ','(call2(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3), fail). not1(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3). call1(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3) :- game_win_x(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3))))). call2(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3) :- game_win_o(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3))))). fail :- failure(a). failure(b). Directives: :- entry(play(Game), .(ground(Game), [])). :- trust(player(Player), [], .(ground(Player), [])). :- trust(abolish0(Player), [], .(ground(Player), [])). Query: play(g,g,a) ---------------------------------------- (9) UnifyTransformerProof (EQUIVALENT) Added a fact for the built-in = predicate [PROLOG]. ---------------------------------------- (10) Obligation: Clauses: play(Game) :- ','(initialize(Game, Position, Player), ','(display_game(Position), play(Position, Player, Result))). play(Position, Player, Result) :- ','(game_over(Position, Player, Result), ','(write(Result), abolish0(player))). play(Position, Player, Result) :- ','(choose(Position, Player, Move), ','(move(Move, Player, Position, Position1), ','(display_game(Position1), ','(next_player(Player, Player1), play(Position1, Player1, Result))))). choose(Position, computer, Move) :- ','(write('Computer is thinking...'), ','(nl, alpha_beta(computer, Position, -1, 1, Move, Value))). choose(Position, Player, Move) :- ','(write(Player), ','(write(', enter move (followed by a period and return) --> '), ','(read(Move1), legal(Position, Player, Move1, Move)))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(==(Player, computer), ','(game_win_o(Position), is(Value, 1))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(player(Player), ','(game_win_x(Position), is(Value, 1))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(game_tie(Position), is(Value, 0)). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(==(Player, computer), ','(game_win_x(Position), is(Value, -1))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(player(Player), ','(game_win_o(Position), is(Value, -1))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(setof(Move1, move(Position, Move1), Moves), ','(is(Alpha1, -(Beta)), ','(is(Beta1, -(Alpha)), evaluate(Player, Moves, Position, Alpha1, Beta1, nil, ','(Move, Value))))). evaluate(Player, .(Move, Moves), Position, Alpha, Beta, Move1, Best) :- ','(move(Move, Player, Position, Position1), ','(next_player(Player, Player1), ','(alpha_beta(Player1, Position1, Alpha, Beta, MoveX, Value), ','(is(Value1, -(Value)), cutoff(Player, Move, Value1, Alpha, Beta, Moves, Position, Move1, Best))))). evaluate(Player, [], Position, Alpha, Beta, Move, ','(Move, Alpha)). cutoff(Player, Move, Value, Alpha, Beta, Moves, Position, Move1, ','(Move, Value)) :- >=(Value, Beta). cutoff(Player, Move, Value, Alpha, Beta, Moves, Position, Move1, Best) :- ','(<(Alpha, Value), ','(<(Value, Beta), evaluate(Player, Moves, Position, Value, Beta, Move, Best))). cutoff(Player, Move, Value, Alpha, Beta, Moves, Position, Move1, Best) :- ','(=<(Value, Alpha), evaluate(Player, Moves, Position, Alpha, Beta, Move1, Best)). initialize(tictactoe, ','(','(' ', ','(' ', ' ')), ','(','(' ', ','(' ', ' ')), ','(' ', ','(' ', ' ')))), Player) :- ','(write('Enter player`s name (followed by a period and return) --> '), ','(read(Player), ','(write(Player), ','(write(', you will go first and use the symbol "x".'), ','(nl, assert(player(Player))))))). display_game(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3))))) :- ','(nl, ','(write(' '), ','(write(R1C1), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R1C2), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R1C3), ','(write(' '), ','(tab(3), ','(write('u-l = upper left, u-c = upper center, u-r = upper right'), ','(nl, ','(write(' --+---+-- '), ','(nl, ','(write(' '), ','(write(R2C1), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R2C2), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R2C3), ','(write(' '), ','(tab(3), ','(write('c-l = center left, c-c = center center, c-r = center right'), ','(nl, ','(write(' --+---+-- '), ','(nl, ','(write(' '), ','(write(R3C1), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R3C2), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R3C3), ','(write(' '), ','(tab(3), ','(write('l-l = lower left, l-c = lower center, l-r = lower right'), ','(nl, nl))))))))))))))))))))))))))))))))))))))))))))))). next_player(Player, computer) :- player(Player). next_player(computer, Player1) :- player(Player1). legal(Position, Player, Move, Move) :- move(Position, Move). legal(Position, Player, Move1, Move) :- ','(write('Illegal move! '), choose(Position, Player, Move)). game_over(Position, Player, ','(Player1, ' you win!')) :- ','(game_win_x(Position), player(Player1)). game_over(Position, Player, 'Computer wins!') :- game_win_o(Position). game_over(Position, Player, 'It is a tie!') :- game_tie(Position). game_tie(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3))))) :- ','(not(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3), ','(not1(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3), ','(\==(R1C1, ' '), ','(\==(R1C2, ' '), ','(\==(R1C3, ' '), ','(\==(R2C1, ' '), ','(\==(R2C2, ' '), ','(\==(R2C3, ' '), ','(\==(R3C1, ' '), ','(\==(R3C2, ' '), \==(R3C3, ' '))))))))))). game_win_x(','(','(x, ','(x, x)), ','(','(X1, ','(X2, X3)), ','(X4, ','(X5, X6))))). game_win_x(','(','(X7, ','(X8, X9)), ','(','(x, ','(x, x)), ','(X10, ','(X11, X12))))). game_win_x(','(','(X13, ','(X14, X15)), ','(','(X16, ','(X17, X18)), ','(x, ','(x, x))))). game_win_x(','(','(x, ','(X19, X20)), ','(','(x, ','(X21, X22)), ','(x, ','(X23, X24))))). game_win_x(','(','(X25, ','(x, X26)), ','(','(X27, ','(x, X28)), ','(X29, ','(x, X30))))). game_win_x(','(','(X31, ','(X32, x)), ','(','(X33, ','(X34, x)), ','(X35, ','(X36, x))))). game_win_x(','(','(x, ','(X37, X38)), ','(','(X39, ','(x, X40)), ','(X41, ','(X42, x))))). game_win_x(','(','(X43, ','(X44, x)), ','(','(X45, ','(x, X46)), ','(x, ','(X47, X48))))). game_win_o(','(','(o, ','(o, o)), ','(','(X49, ','(X50, X51)), ','(X52, ','(X53, X54))))). game_win_o(','(','(X55, ','(X56, X57)), ','(','(o, ','(o, o)), ','(X58, ','(X59, X60))))). game_win_o(','(','(X61, ','(X62, X63)), ','(','(X64, ','(X65, X66)), ','(o, ','(o, o))))). game_win_o(','(','(o, ','(X67, X68)), ','(','(o, ','(X69, X70)), ','(o, ','(X71, X72))))). game_win_o(','(','(X73, ','(o, X74)), ','(','(X75, ','(o, X76)), ','(X77, ','(o, X78))))). game_win_o(','(','(X79, ','(X80, o)), ','(','(X81, ','(X82, o)), ','(X83, ','(X84, o))))). game_win_o(','(','(o, ','(X85, X86)), ','(','(X87, ','(o, X88)), ','(X89, ','(X90, o))))). game_win_o(','(','(X91, ','(X92, o)), ','(','(X93, ','(o, X94)), ','(o, ','(X95, X96))))). move(','(','(' ', ','(X97, X98)), ','(','(X99, ','(X100, X101)), ','(X102, ','(X103, X104)))), -(u, l)). move(','(','(X105, ','(' ', X106)), ','(','(X107, ','(X108, X109)), ','(X110, ','(X111, X112)))), -(u, c)). move(','(','(X113, ','(X114, ' ')), ','(','(X115, ','(X116, X117)), ','(X118, ','(X119, X120)))), -(u, r)). move(','(','(X121, ','(X122, X123)), ','(','(' ', ','(X124, X125)), ','(X126, ','(X127, X128)))), -(c, l)). move(','(','(X129, ','(X130, X131)), ','(','(X132, ','(' ', X133)), ','(X134, ','(X135, X136)))), -(c, c)). move(','(','(X137, ','(X138, X139)), ','(','(X140, ','(X141, ' ')), ','(X142, ','(X143, X144)))), -(c, r)). move(','(','(X145, ','(X146, X147)), ','(','(X148, ','(X149, X150)), ','(' ', ','(X151, X152)))), -(l, l)). move(','(','(X153, ','(X154, X155)), ','(','(X156, ','(X157, X158)), ','(X159, ','(' ', X160)))), -(l, c)). move(','(','(X161, ','(X162, X163)), ','(','(X164, ','(X165, X166)), ','(X167, ','(X168, ' ')))), -(l, r)). move(-(u, l), computer, Position, Position1) :- ','(=(','(','(X169, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(o, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(u, c), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(X170, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(o, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(u, r), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, X171)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, o)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, l), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(X172, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(o, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, c), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(X173, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(o, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, r), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, X174)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, o)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(l, l), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(X175, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(o, ','(R3C2, R3C3)))))). move(-(l, c), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(X176, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(o, R3C3)))))). move(-(l, r), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, X177)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, o)))))). move(-(u, l), Player, Position, Position1) :- ','(=(','(','(X178, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(x, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(u, c), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(X179, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(x, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(u, r), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, X180)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, x)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, l), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(X181, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(x, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, c), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(X182, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(x, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, r), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, X183)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, x)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(l, l), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(X184, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(x, ','(R3C2, R3C3)))))). move(-(l, c), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(X185, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(x, R3C3)))))). move(-(l, r), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, X186)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, x)))))). not(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3) :- ','(call1(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3), fail). not(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3). not1(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3) :- ','(call2(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3), fail). not1(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3). call1(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3) :- game_win_x(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3))))). call2(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3) :- game_win_o(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3))))). fail :- failure(a). failure(b). =(X, X). Directives: :- entry(play(Game), .(ground(Game), [])). :- trust(player(Player), [], .(ground(Player), [])). :- trust(abolish0(Player), [], .(ground(Player), [])). Query: play(g,g,a) ---------------------------------------- (11) UndefinedPredicateHandlerProof (SOUND) Added facts for all undefined predicates [PROLOG]. ---------------------------------------- (12) Obligation: Clauses: play(Game) :- ','(initialize(Game, Position, Player), ','(display_game(Position), play(Position, Player, Result))). play(Position, Player, Result) :- ','(game_over(Position, Player, Result), ','(write(Result), abolish0(player))). play(Position, Player, Result) :- ','(choose(Position, Player, Move), ','(move(Move, Player, Position, Position1), ','(display_game(Position1), ','(next_player(Player, Player1), play(Position1, Player1, Result))))). choose(Position, computer, Move) :- ','(write('Computer is thinking...'), ','(nl, alpha_beta(computer, Position, -1, 1, Move, Value))). choose(Position, Player, Move) :- ','(write(Player), ','(write(', enter move (followed by a period and return) --> '), ','(read(Move1), legal(Position, Player, Move1, Move)))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(==(Player, computer), ','(game_win_o(Position), is(Value, 1))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(player(Player), ','(game_win_x(Position), is(Value, 1))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(game_tie(Position), is(Value, 0)). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(==(Player, computer), ','(game_win_x(Position), is(Value, -1))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(player(Player), ','(game_win_o(Position), is(Value, -1))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(setof(Move1, move(Position, Move1), Moves), ','(is(Alpha1, -(Beta)), ','(is(Beta1, -(Alpha)), evaluate(Player, Moves, Position, Alpha1, Beta1, nil, ','(Move, Value))))). evaluate(Player, .(Move, Moves), Position, Alpha, Beta, Move1, Best) :- ','(move(Move, Player, Position, Position1), ','(next_player(Player, Player1), ','(alpha_beta(Player1, Position1, Alpha, Beta, MoveX, Value), ','(is(Value1, -(Value)), cutoff(Player, Move, Value1, Alpha, Beta, Moves, Position, Move1, Best))))). evaluate(Player, [], Position, Alpha, Beta, Move, ','(Move, Alpha)). cutoff(Player, Move, Value, Alpha, Beta, Moves, Position, Move1, ','(Move, Value)) :- >=(Value, Beta). cutoff(Player, Move, Value, Alpha, Beta, Moves, Position, Move1, Best) :- ','(<(Alpha, Value), ','(<(Value, Beta), evaluate(Player, Moves, Position, Value, Beta, Move, Best))). cutoff(Player, Move, Value, Alpha, Beta, Moves, Position, Move1, Best) :- ','(=<(Value, Alpha), evaluate(Player, Moves, Position, Alpha, Beta, Move1, Best)). initialize(tictactoe, ','(','(' ', ','(' ', ' ')), ','(','(' ', ','(' ', ' ')), ','(' ', ','(' ', ' ')))), Player) :- ','(write('Enter player`s name (followed by a period and return) --> '), ','(read(Player), ','(write(Player), ','(write(', you will go first and use the symbol "x".'), ','(nl, assert(player(Player))))))). display_game(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3))))) :- ','(nl, ','(write(' '), ','(write(R1C1), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R1C2), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R1C3), ','(write(' '), ','(tab(3), ','(write('u-l = upper left, u-c = upper center, u-r = upper right'), ','(nl, ','(write(' --+---+-- '), ','(nl, ','(write(' '), ','(write(R2C1), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R2C2), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R2C3), ','(write(' '), ','(tab(3), ','(write('c-l = center left, c-c = center center, c-r = center right'), ','(nl, ','(write(' --+---+-- '), ','(nl, ','(write(' '), ','(write(R3C1), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R3C2), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R3C3), ','(write(' '), ','(tab(3), ','(write('l-l = lower left, l-c = lower center, l-r = lower right'), ','(nl, nl))))))))))))))))))))))))))))))))))))))))))))))). next_player(Player, computer) :- player(Player). next_player(computer, Player1) :- player(Player1). legal(Position, Player, Move, Move) :- move(Position, Move). legal(Position, Player, Move1, Move) :- ','(write('Illegal move! '), choose(Position, Player, Move)). game_over(Position, Player, ','(Player1, ' you win!')) :- ','(game_win_x(Position), player(Player1)). game_over(Position, Player, 'Computer wins!') :- game_win_o(Position). game_over(Position, Player, 'It is a tie!') :- game_tie(Position). game_tie(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3))))) :- ','(not(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3), ','(not1(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3), ','(\==(R1C1, ' '), ','(\==(R1C2, ' '), ','(\==(R1C3, ' '), ','(\==(R2C1, ' '), ','(\==(R2C2, ' '), ','(\==(R2C3, ' '), ','(\==(R3C1, ' '), ','(\==(R3C2, ' '), \==(R3C3, ' '))))))))))). game_win_x(','(','(x, ','(x, x)), ','(','(X1, ','(X2, X3)), ','(X4, ','(X5, X6))))). game_win_x(','(','(X7, ','(X8, X9)), ','(','(x, ','(x, x)), ','(X10, ','(X11, X12))))). game_win_x(','(','(X13, ','(X14, X15)), ','(','(X16, ','(X17, X18)), ','(x, ','(x, x))))). game_win_x(','(','(x, ','(X19, X20)), ','(','(x, ','(X21, X22)), ','(x, ','(X23, X24))))). game_win_x(','(','(X25, ','(x, X26)), ','(','(X27, ','(x, X28)), ','(X29, ','(x, X30))))). game_win_x(','(','(X31, ','(X32, x)), ','(','(X33, ','(X34, x)), ','(X35, ','(X36, x))))). game_win_x(','(','(x, ','(X37, X38)), ','(','(X39, ','(x, X40)), ','(X41, ','(X42, x))))). game_win_x(','(','(X43, ','(X44, x)), ','(','(X45, ','(x, X46)), ','(x, ','(X47, X48))))). game_win_o(','(','(o, ','(o, o)), ','(','(X49, ','(X50, X51)), ','(X52, ','(X53, X54))))). game_win_o(','(','(X55, ','(X56, X57)), ','(','(o, ','(o, o)), ','(X58, ','(X59, X60))))). game_win_o(','(','(X61, ','(X62, X63)), ','(','(X64, ','(X65, X66)), ','(o, ','(o, o))))). game_win_o(','(','(o, ','(X67, X68)), ','(','(o, ','(X69, X70)), ','(o, ','(X71, X72))))). game_win_o(','(','(X73, ','(o, X74)), ','(','(X75, ','(o, X76)), ','(X77, ','(o, X78))))). game_win_o(','(','(X79, ','(X80, o)), ','(','(X81, ','(X82, o)), ','(X83, ','(X84, o))))). game_win_o(','(','(o, ','(X85, X86)), ','(','(X87, ','(o, X88)), ','(X89, ','(X90, o))))). game_win_o(','(','(X91, ','(X92, o)), ','(','(X93, ','(o, X94)), ','(o, ','(X95, X96))))). move(','(','(' ', ','(X97, X98)), ','(','(X99, ','(X100, X101)), ','(X102, ','(X103, X104)))), -(u, l)). move(','(','(X105, ','(' ', X106)), ','(','(X107, ','(X108, X109)), ','(X110, ','(X111, X112)))), -(u, c)). move(','(','(X113, ','(X114, ' ')), ','(','(X115, ','(X116, X117)), ','(X118, ','(X119, X120)))), -(u, r)). move(','(','(X121, ','(X122, X123)), ','(','(' ', ','(X124, X125)), ','(X126, ','(X127, X128)))), -(c, l)). move(','(','(X129, ','(X130, X131)), ','(','(X132, ','(' ', X133)), ','(X134, ','(X135, X136)))), -(c, c)). move(','(','(X137, ','(X138, X139)), ','(','(X140, ','(X141, ' ')), ','(X142, ','(X143, X144)))), -(c, r)). move(','(','(X145, ','(X146, X147)), ','(','(X148, ','(X149, X150)), ','(' ', ','(X151, X152)))), -(l, l)). move(','(','(X153, ','(X154, X155)), ','(','(X156, ','(X157, X158)), ','(X159, ','(' ', X160)))), -(l, c)). move(','(','(X161, ','(X162, X163)), ','(','(X164, ','(X165, X166)), ','(X167, ','(X168, ' ')))), -(l, r)). move(-(u, l), computer, Position, Position1) :- ','(=(','(','(X169, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(o, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(u, c), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(X170, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(o, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(u, r), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, X171)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, o)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, l), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(X172, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(o, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, c), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(X173, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(o, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, r), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, X174)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, o)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(l, l), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(X175, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(o, ','(R3C2, R3C3)))))). move(-(l, c), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(X176, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(o, R3C3)))))). move(-(l, r), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, X177)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, o)))))). move(-(u, l), Player, Position, Position1) :- ','(=(','(','(X178, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(x, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(u, c), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(X179, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(x, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(u, r), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, X180)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, x)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, l), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(X181, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(x, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, c), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(X182, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(x, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, r), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, X183)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, x)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(l, l), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(X184, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(x, ','(R3C2, R3C3)))))). move(-(l, c), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(X185, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(x, R3C3)))))). move(-(l, r), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, X186)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, x)))))). not(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3) :- ','(call1(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3), fail). not(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3). not1(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3) :- ','(call2(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3), fail). not1(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3). call1(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3) :- game_win_x(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3))))). call2(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3) :- game_win_o(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3))))). fail :- failure(a). failure(b). =(X, X). write(X0). abolish0(X0). nl. read(X0). ==(X0, X1). is(X0, X1). player(X0). setof(X0, X1, X2). >=(X0, X1). <(X0, X1). =<(X0, X1). assert(X0). tab(X0). \==(X0, X1). Directives: :- entry(play(Game), .(ground(Game), [])). :- trust(player(Player), [], .(ground(Player), [])). :- trust(abolish0(Player), [], .(ground(Player), [])). Query: play(g,g,a) ---------------------------------------- (13) IntegerArithmeticTransformerProof (SOUND) Added definitions of predefined predicates [PROLOG]. ---------------------------------------- (14) Obligation: Clauses: play(Game) :- ','(initialize(Game, Position, Player), ','(display_game(Position), play(Position, Player, Result))). play(Position, Player, Result) :- ','(game_over(Position, Player, Result), ','(!, ','(write(Result), abolish0(player)))). play(Position, Player, Result) :- ','(choose(Position, Player, Move), ','(move(Move, Player, Position, Position1), ','(display_game(Position1), ','(next_player(Player, Player1), ','(!, play(Position1, Player1, Result)))))). choose(Position, computer, Move) :- ','(write('Computer is thinking...'), ','(nl, alpha_beta(computer, Position, pred(zero), succ(zero), Move, Value))). choose(Position, Player, Move) :- ','(write(Player), ','(write(', enter move (followed by a period and return) --> '), ','(read(Move1), legal(Position, Player, Move1, Move)))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(==(Player, computer), ','(game_win_o(Position), =(Value, succ(zero)))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(player(Player), ','(game_win_x(Position), =(Value, succ(zero)))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(game_tie(Position), =(Value, zero)). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(==(Player, computer), ','(game_win_x(Position), =(Value, pred(zero)))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(player(Player), ','(game_win_o(Position), =(Value, pred(zero)))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(setof(Move1, move(Position, Move1), Moves), ','(isMinus(zero1, Beta, U), ','(=(Alpha1, U), ','(isMinus(zero1, Alpha, U), ','(=(Beta1, U), evaluate(Player, Moves, Position, Alpha1, Beta1, nil, ','(Move, Value))))))). evaluate(Player, .(Move, Moves), Position, Alpha, Beta, Move1, Best) :- ','(move(Move, Player, Position, Position1), ','(next_player(Player, Player1), ','(alpha_beta(Player1, Position1, Alpha, Beta, MoveX, Value), ','(isMinus(zero1, Value, U), ','(=(Value1, U), ','(cutoff(Player, Move, Value1, Alpha, Beta, Moves, Position, Move1, Best), !)))))). evaluate(Player, [], Position, Alpha, Beta, Move, ','(Move, Alpha)). cutoff(Player, Move, Value, Alpha, Beta, Moves, Position, Move1, ','(Move, Value)) :- ','(=(X, Value), ','(=(X1, Beta), ','(;(isGreater(X, X1), =(X, X1)), !))). cutoff(Player, Move, Value, Alpha, Beta, Moves, Position, Move1, Best) :- ','(=(X, Alpha), ','(=(X1, Value), ','(isLess(X, X1), ','(=(X2, Value), ','(=(X3, Beta), ','(isLess(X2, X3), ','(!, evaluate(Player, Moves, Position, Value, Beta, Move, Best)))))))). cutoff(Player, Move, Value, Alpha, Beta, Moves, Position, Move1, Best) :- ','(=(X, Value), ','(=(X1, Alpha), ','(;(=(X, X1), isLess(X, X1)), ','(!, evaluate(Player, Moves, Position, Alpha, Beta, Move1, Best))))). initialize(tictactoe, ','(','(' ', ','(' ', ' ')), ','(','(' ', ','(' ', ' ')), ','(' ', ','(' ', ' ')))), Player) :- ','(write('Enter player`s name (followed by a period and return) --> '), ','(read(Player), ','(write(Player), ','(write(', you will go first and use the symbol "x".'), ','(nl, assert(player(Player))))))). display_game(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3))))) :- ','(nl, ','(write(' '), ','(write(R1C1), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R1C2), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R1C3), ','(write(' '), ','(tab(succ(succ(succ(zero)))), ','(write('u-l = upper left, u-c = upper center, u-r = upper right'), ','(nl, ','(write(' --+---+-- '), ','(nl, ','(write(' '), ','(write(R2C1), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R2C2), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R2C3), ','(write(' '), ','(tab(succ(succ(succ(zero)))), ','(write('c-l = center left, c-c = center center, c-r = center right'), ','(nl, ','(write(' --+---+-- '), ','(nl, ','(write(' '), ','(write(R3C1), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R3C2), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R3C3), ','(write(' '), ','(tab(succ(succ(succ(zero)))), ','(write('l-l = lower left, l-c = lower center, l-r = lower right'), ','(nl, nl))))))))))))))))))))))))))))))))))))))))))))))). next_player(Player, computer) :- player(Player). next_player(computer, Player1) :- player(Player1). legal(Position, Player, Move, Move) :- move(Position, Move). legal(Position, Player, Move1, Move) :- ','(write('Illegal move! '), ','(!, choose(Position, Player, Move))). game_over(Position, Player, ','(Player1, ' you win!')) :- ','(game_win_x(Position), player(Player1)). game_over(Position, Player, 'Computer wins!') :- game_win_o(Position). game_over(Position, Player, 'It is a tie!') :- game_tie(Position). game_tie(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3))))) :- ','(\+(game_win_x(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))), ','(\+(game_win_o(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))), ','(\==(R1C1, ' '), ','(\==(R1C2, ' '), ','(\==(R1C3, ' '), ','(\==(R2C1, ' '), ','(\==(R2C2, ' '), ','(\==(R2C3, ' '), ','(\==(R3C1, ' '), ','(\==(R3C2, ' '), \==(R3C3, ' '))))))))))). game_win_x(','(','(x, ','(x, x)), ','(','(X1, ','(X2, X3)), ','(X4, ','(X5, X6))))). game_win_x(','(','(X7, ','(X8, X9)), ','(','(x, ','(x, x)), ','(X10, ','(X11, X12))))). game_win_x(','(','(X13, ','(X14, X15)), ','(','(X16, ','(X17, X18)), ','(x, ','(x, x))))). game_win_x(','(','(x, ','(X19, X20)), ','(','(x, ','(X21, X22)), ','(x, ','(X23, X24))))). game_win_x(','(','(X25, ','(x, X26)), ','(','(X27, ','(x, X28)), ','(X29, ','(x, X30))))). game_win_x(','(','(X31, ','(X32, x)), ','(','(X33, ','(X34, x)), ','(X35, ','(X36, x))))). game_win_x(','(','(x, ','(X37, X38)), ','(','(X39, ','(x, X40)), ','(X41, ','(X42, x))))). game_win_x(','(','(X43, ','(X44, x)), ','(','(X45, ','(x, X46)), ','(x, ','(X47, X48))))). game_win_o(','(','(o, ','(o, o)), ','(','(X49, ','(X50, X51)), ','(X52, ','(X53, X54))))). game_win_o(','(','(X55, ','(X56, X57)), ','(','(o, ','(o, o)), ','(X58, ','(X59, X60))))). game_win_o(','(','(X61, ','(X62, X63)), ','(','(X64, ','(X65, X66)), ','(o, ','(o, o))))). game_win_o(','(','(o, ','(X67, X68)), ','(','(o, ','(X69, X70)), ','(o, ','(X71, X72))))). game_win_o(','(','(X73, ','(o, X74)), ','(','(X75, ','(o, X76)), ','(X77, ','(o, X78))))). game_win_o(','(','(X79, ','(X80, o)), ','(','(X81, ','(X82, o)), ','(X83, ','(X84, o))))). game_win_o(','(','(o, ','(X85, X86)), ','(','(X87, ','(o, X88)), ','(X89, ','(X90, o))))). game_win_o(','(','(X91, ','(X92, o)), ','(','(X93, ','(o, X94)), ','(o, ','(X95, X96))))). move(','(','(' ', ','(X97, X98)), ','(','(X99, ','(X100, X101)), ','(X102, ','(X103, X104)))), -(u, l)). move(','(','(X105, ','(' ', X106)), ','(','(X107, ','(X108, X109)), ','(X110, ','(X111, X112)))), -(u, c)). move(','(','(X113, ','(X114, ' ')), ','(','(X115, ','(X116, X117)), ','(X118, ','(X119, X120)))), -(u, r)). move(','(','(X121, ','(X122, X123)), ','(','(' ', ','(X124, X125)), ','(X126, ','(X127, X128)))), -(c, l)). move(','(','(X129, ','(X130, X131)), ','(','(X132, ','(' ', X133)), ','(X134, ','(X135, X136)))), -(c, c)). move(','(','(X137, ','(X138, X139)), ','(','(X140, ','(X141, ' ')), ','(X142, ','(X143, X144)))), -(c, r)). move(','(','(X145, ','(X146, X147)), ','(','(X148, ','(X149, X150)), ','(' ', ','(X151, X152)))), -(l, l)). move(','(','(X153, ','(X154, X155)), ','(','(X156, ','(X157, X158)), ','(X159, ','(' ', X160)))), -(l, c)). move(','(','(X161, ','(X162, X163)), ','(','(X164, ','(X165, X166)), ','(X167, ','(X168, ' ')))), -(l, r)). move(-(u, l), computer, Position, Position1) :- ','(=(','(','(X169, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(o, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(u, c), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(X170, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(o, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(u, r), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, X171)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, o)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, l), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(X172, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(o, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, c), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(X173, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(o, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, r), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, X174)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, o)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(l, l), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(X175, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(o, ','(R3C2, R3C3)))))). move(-(l, c), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(X176, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(o, R3C3)))))). move(-(l, r), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, X177)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, o)))))). move(-(u, l), Player, Position, Position1) :- ','(=(','(','(X178, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(x, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(u, c), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(X179, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(x, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(u, r), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, X180)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, x)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, l), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(X181, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(x, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, c), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(X182, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(x, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, r), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, X183)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, x)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(l, l), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(X184, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(x, ','(R3C2, R3C3)))))). move(-(l, c), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(X185, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(x, R3C3)))))). move(-(l, r), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, X186)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, x)))))). isPlus(zero, X, X). isPlus(succ(X), zero, succ(X)). isPlus(succ(X), succ(Y), succ(succ(Z))) :- isPlus(X, Y, Z). isPlus(succ(X), pred(Y), Z) :- isPlus(X, Y, Z). isPlus(pred(X), zero, pred(X)). isPlus(pred(X), succ(Y), Z) :- isPlus(X, Y, Z). isPlus(pred(X), pred(Y), pred(pred(Z))) :- isPlus(X, Y, Z). isMinus(X, zero, X). isMinus(zero, succ(Y), pred(Z)) :- isMinus(zero, Y, Z). isMinus(zero, pred(Y), succ(Z)) :- isMinus(zero, Y, Z). isMinus(succ(X), succ(Y), Z) :- isMinus(X, Y, Z). isMinus(succ(X), pred(Y), succ(succ(Z))) :- isMinus(X, Y, Z). isMinus(pred(X), succ(Y), pred(pred(Z))) :- isMinus(X, Y, Z). isMinus(pred(X), pred(Y), Z) :- isMinus(X, Y, Z). isTimes(X, zero, zero). isTimes(zero, succ(Y), zero). isTimes(zero, pred(Y), zero). isTimes(succ(X), succ(Y), Z) :- ','(isTimes(succ(X), Y, A), isPlus(A, succ(X), Z)). isTimes(succ(X), pred(Y), Z) :- ','(isTimes(succ(X), Y, A), isMinus(A, succ(X), Z)). isTimes(pred(X), succ(Y), Z) :- ','(isTimes(pred(X), Y, A), isPlus(A, pred(X), Z)). isTimes(pred(X), pred(Y), Z) :- ','(isTimes(pred(X), Y, A), isMinus(A, pred(X), Z)). isDiv(zero, succ(Y), zero). isDiv(zero, pred(Y), zero). isDiv(succ(X), succ(Y), zero) :- isMinus(succ(X), succ(Y), pred(Z)). isDiv(succ(X), succ(Y), succ(Z)) :- ','(isMinus(succ(X), succ(Y), A), isDiv(A, succ(Y), Z)). isDiv(succ(X), pred(Y), Z) :- ','(isMinus(zero, pred(Y), A), ','(isDiv(succ(X), A, B), isMinus(zero, B, Z))). isDiv(pred(X), pred(Y), zero) :- isMinus(pred(X), pred(Y), succ(Z)). isDiv(pred(X), pred(Y), succ(Z)) :- ','(isMinus(pred(X), pred(Y), A), isDiv(A, pred(Y), Z)). isDiv(pred(X), succ(Y), Z) :- ','(isMinus(zero, pred(X), A), ','(isDiv(A, succ(Y), B), isMinus(zero, B, Z))). isModulo(X, Y, Z) :- ','(isDiv(X, Y, A), ','(isTimes(A, Y, B), isMinus(X, B, Z))). isGreater(succ(X), zero). isGreater(succ(X), pred(Y)). isGreater(succ(X), succ(Y)) :- isGreater(X, Y). isGreater(zero, pred(Y)). isGreater(pred(X), pred(Y)) :- isGreater(X, Y). isLess(pred(X), zero). isLess(pred(X), succ(Y)). isLess(pred(X), pred(Y)) :- isLess(X, Y). isLess(zero, succ(Y)). isLess(succ(X), succ(Y)) :- isLess(X, Y). Directives: :- entry(play(Game), .(ground(Game), [])). :- trust(player(Player), [], .(ground(Player), [])). :- trust(abolish0(Player), [], .(ground(Player), [])). Query: play(g,g,a) ---------------------------------------- (15) NotTransformerProof (EQUIVALENT) Transformed all not-constructs [PROLOG]. ---------------------------------------- (16) Obligation: Clauses: play(Game) :- ','(initialize(Game, Position, Player), ','(display_game(Position), play(Position, Player, Result))). play(Position, Player, Result) :- ','(game_over(Position, Player, Result), ','(!, ','(write(Result), abolish0(player)))). play(Position, Player, Result) :- ','(choose(Position, Player, Move), ','(move(Move, Player, Position, Position1), ','(display_game(Position1), ','(next_player(Player, Player1), ','(!, play(Position1, Player1, Result)))))). choose(Position, computer, Move) :- ','(write('Computer is thinking...'), ','(nl, alpha_beta(computer, Position, pred(zero), succ(zero), Move, Value))). choose(Position, Player, Move) :- ','(write(Player), ','(write(', enter move (followed by a period and return) --> '), ','(read(Move1), legal(Position, Player, Move1, Move)))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(==(Player, computer), ','(game_win_o(Position), =(Value, succ(zero)))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(player(Player), ','(game_win_x(Position), =(Value, succ(zero)))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(game_tie(Position), =(Value, zero)). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(==(Player, computer), ','(game_win_x(Position), =(Value, pred(zero)))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(player(Player), ','(game_win_o(Position), =(Value, pred(zero)))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(setof(Move1, move(Position, Move1), Moves), ','(isMinus(zero1, Beta, U), ','(=(Alpha1, U), ','(isMinus(zero1, Alpha, U), ','(=(Beta1, U), evaluate(Player, Moves, Position, Alpha1, Beta1, nil, ','(Move, Value))))))). evaluate(Player, .(Move, Moves), Position, Alpha, Beta, Move1, Best) :- ','(move(Move, Player, Position, Position1), ','(next_player(Player, Player1), ','(alpha_beta(Player1, Position1, Alpha, Beta, MoveX, Value), ','(isMinus(zero1, Value, U), ','(=(Value1, U), ','(cutoff(Player, Move, Value1, Alpha, Beta, Moves, Position, Move1, Best), !)))))). evaluate(Player, [], Position, Alpha, Beta, Move, ','(Move, Alpha)). cutoff(Player, Move, Value, Alpha, Beta, Moves, Position, Move1, ','(Move, Value)) :- ','(=(X, Value), ','(=(X1, Beta), ','(;(isGreater(X, X1), =(X, X1)), !))). cutoff(Player, Move, Value, Alpha, Beta, Moves, Position, Move1, Best) :- ','(=(X, Alpha), ','(=(X1, Value), ','(isLess(X, X1), ','(=(X2, Value), ','(=(X3, Beta), ','(isLess(X2, X3), ','(!, evaluate(Player, Moves, Position, Value, Beta, Move, Best)))))))). cutoff(Player, Move, Value, Alpha, Beta, Moves, Position, Move1, Best) :- ','(=(X, Value), ','(=(X1, Alpha), ','(;(=(X, X1), isLess(X, X1)), ','(!, evaluate(Player, Moves, Position, Alpha, Beta, Move1, Best))))). initialize(tictactoe, ','(','(' ', ','(' ', ' ')), ','(','(' ', ','(' ', ' ')), ','(' ', ','(' ', ' ')))), Player) :- ','(write('Enter player`s name (followed by a period and return) --> '), ','(read(Player), ','(write(Player), ','(write(', you will go first and use the symbol "x".'), ','(nl, assert(player(Player))))))). display_game(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3))))) :- ','(nl, ','(write(' '), ','(write(R1C1), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R1C2), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R1C3), ','(write(' '), ','(tab(succ(succ(succ(zero)))), ','(write('u-l = upper left, u-c = upper center, u-r = upper right'), ','(nl, ','(write(' --+---+-- '), ','(nl, ','(write(' '), ','(write(R2C1), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R2C2), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R2C3), ','(write(' '), ','(tab(succ(succ(succ(zero)))), ','(write('c-l = center left, c-c = center center, c-r = center right'), ','(nl, ','(write(' --+---+-- '), ','(nl, ','(write(' '), ','(write(R3C1), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R3C2), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R3C3), ','(write(' '), ','(tab(succ(succ(succ(zero)))), ','(write('l-l = lower left, l-c = lower center, l-r = lower right'), ','(nl, nl))))))))))))))))))))))))))))))))))))))))))))))). next_player(Player, computer) :- player(Player). next_player(computer, Player1) :- player(Player1). legal(Position, Player, Move, Move) :- move(Position, Move). legal(Position, Player, Move1, Move) :- ','(write('Illegal move! '), ','(!, choose(Position, Player, Move))). game_over(Position, Player, ','(Player1, ' you win!')) :- ','(game_win_x(Position), player(Player1)). game_over(Position, Player, 'Computer wins!') :- game_win_o(Position). game_over(Position, Player, 'It is a tie!') :- game_tie(Position). game_tie(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3))))) :- ','(not(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3), ','(not1(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3), ','(\==(R1C1, ' '), ','(\==(R1C2, ' '), ','(\==(R1C3, ' '), ','(\==(R2C1, ' '), ','(\==(R2C2, ' '), ','(\==(R2C3, ' '), ','(\==(R3C1, ' '), ','(\==(R3C2, ' '), \==(R3C3, ' '))))))))))). game_win_x(','(','(x, ','(x, x)), ','(','(X1, ','(X2, X3)), ','(X4, ','(X5, X6))))). game_win_x(','(','(X7, ','(X8, X9)), ','(','(x, ','(x, x)), ','(X10, ','(X11, X12))))). game_win_x(','(','(X13, ','(X14, X15)), ','(','(X16, ','(X17, X18)), ','(x, ','(x, x))))). game_win_x(','(','(x, ','(X19, X20)), ','(','(x, ','(X21, X22)), ','(x, ','(X23, X24))))). game_win_x(','(','(X25, ','(x, X26)), ','(','(X27, ','(x, X28)), ','(X29, ','(x, X30))))). game_win_x(','(','(X31, ','(X32, x)), ','(','(X33, ','(X34, x)), ','(X35, ','(X36, x))))). game_win_x(','(','(x, ','(X37, X38)), ','(','(X39, ','(x, X40)), ','(X41, ','(X42, x))))). game_win_x(','(','(X43, ','(X44, x)), ','(','(X45, ','(x, X46)), ','(x, ','(X47, X48))))). game_win_o(','(','(o, ','(o, o)), ','(','(X49, ','(X50, X51)), ','(X52, ','(X53, X54))))). game_win_o(','(','(X55, ','(X56, X57)), ','(','(o, ','(o, o)), ','(X58, ','(X59, X60))))). game_win_o(','(','(X61, ','(X62, X63)), ','(','(X64, ','(X65, X66)), ','(o, ','(o, o))))). game_win_o(','(','(o, ','(X67, X68)), ','(','(o, ','(X69, X70)), ','(o, ','(X71, X72))))). game_win_o(','(','(X73, ','(o, X74)), ','(','(X75, ','(o, X76)), ','(X77, ','(o, X78))))). game_win_o(','(','(X79, ','(X80, o)), ','(','(X81, ','(X82, o)), ','(X83, ','(X84, o))))). game_win_o(','(','(o, ','(X85, X86)), ','(','(X87, ','(o, X88)), ','(X89, ','(X90, o))))). game_win_o(','(','(X91, ','(X92, o)), ','(','(X93, ','(o, X94)), ','(o, ','(X95, X96))))). move(','(','(' ', ','(X97, X98)), ','(','(X99, ','(X100, X101)), ','(X102, ','(X103, X104)))), -(u, l)). move(','(','(X105, ','(' ', X106)), ','(','(X107, ','(X108, X109)), ','(X110, ','(X111, X112)))), -(u, c)). move(','(','(X113, ','(X114, ' ')), ','(','(X115, ','(X116, X117)), ','(X118, ','(X119, X120)))), -(u, r)). move(','(','(X121, ','(X122, X123)), ','(','(' ', ','(X124, X125)), ','(X126, ','(X127, X128)))), -(c, l)). move(','(','(X129, ','(X130, X131)), ','(','(X132, ','(' ', X133)), ','(X134, ','(X135, X136)))), -(c, c)). move(','(','(X137, ','(X138, X139)), ','(','(X140, ','(X141, ' ')), ','(X142, ','(X143, X144)))), -(c, r)). move(','(','(X145, ','(X146, X147)), ','(','(X148, ','(X149, X150)), ','(' ', ','(X151, X152)))), -(l, l)). move(','(','(X153, ','(X154, X155)), ','(','(X156, ','(X157, X158)), ','(X159, ','(' ', X160)))), -(l, c)). move(','(','(X161, ','(X162, X163)), ','(','(X164, ','(X165, X166)), ','(X167, ','(X168, ' ')))), -(l, r)). move(-(u, l), computer, Position, Position1) :- ','(=(','(','(X169, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(o, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(u, c), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(X170, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(o, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(u, r), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, X171)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, o)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, l), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(X172, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(o, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, c), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(X173, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(o, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, r), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, X174)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, o)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(l, l), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(X175, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(o, ','(R3C2, R3C3)))))). move(-(l, c), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(X176, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(o, R3C3)))))). move(-(l, r), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, X177)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, o)))))). move(-(u, l), Player, Position, Position1) :- ','(=(','(','(X178, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(x, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(u, c), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(X179, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(x, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(u, r), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, X180)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, x)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, l), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(X181, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(x, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, c), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(X182, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(x, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, r), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, X183)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, x)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(l, l), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(X184, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(x, ','(R3C2, R3C3)))))). move(-(l, c), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(X185, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(x, R3C3)))))). move(-(l, r), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, X186)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, x)))))). isPlus(zero, X, X). isPlus(succ(X), zero, succ(X)). isPlus(succ(X), succ(Y), succ(succ(Z))) :- isPlus(X, Y, Z). isPlus(succ(X), pred(Y), Z) :- isPlus(X, Y, Z). isPlus(pred(X), zero, pred(X)). isPlus(pred(X), succ(Y), Z) :- isPlus(X, Y, Z). isPlus(pred(X), pred(Y), pred(pred(Z))) :- isPlus(X, Y, Z). isMinus(X, zero, X). isMinus(zero, succ(Y), pred(Z)) :- isMinus(zero, Y, Z). isMinus(zero, pred(Y), succ(Z)) :- isMinus(zero, Y, Z). isMinus(succ(X), succ(Y), Z) :- isMinus(X, Y, Z). isMinus(succ(X), pred(Y), succ(succ(Z))) :- isMinus(X, Y, Z). isMinus(pred(X), succ(Y), pred(pred(Z))) :- isMinus(X, Y, Z). isMinus(pred(X), pred(Y), Z) :- isMinus(X, Y, Z). isTimes(X, zero, zero). isTimes(zero, succ(Y), zero). isTimes(zero, pred(Y), zero). isTimes(succ(X), succ(Y), Z) :- ','(isTimes(succ(X), Y, A), isPlus(A, succ(X), Z)). isTimes(succ(X), pred(Y), Z) :- ','(isTimes(succ(X), Y, A), isMinus(A, succ(X), Z)). isTimes(pred(X), succ(Y), Z) :- ','(isTimes(pred(X), Y, A), isPlus(A, pred(X), Z)). isTimes(pred(X), pred(Y), Z) :- ','(isTimes(pred(X), Y, A), isMinus(A, pred(X), Z)). isDiv(zero, succ(Y), zero). isDiv(zero, pred(Y), zero). isDiv(succ(X), succ(Y), zero) :- isMinus(succ(X), succ(Y), pred(Z)). isDiv(succ(X), succ(Y), succ(Z)) :- ','(isMinus(succ(X), succ(Y), A), isDiv(A, succ(Y), Z)). isDiv(succ(X), pred(Y), Z) :- ','(isMinus(zero, pred(Y), A), ','(isDiv(succ(X), A, B), isMinus(zero, B, Z))). isDiv(pred(X), pred(Y), zero) :- isMinus(pred(X), pred(Y), succ(Z)). isDiv(pred(X), pred(Y), succ(Z)) :- ','(isMinus(pred(X), pred(Y), A), isDiv(A, pred(Y), Z)). isDiv(pred(X), succ(Y), Z) :- ','(isMinus(zero, pred(X), A), ','(isDiv(A, succ(Y), B), isMinus(zero, B, Z))). isModulo(X, Y, Z) :- ','(isDiv(X, Y, A), ','(isTimes(A, Y, B), isMinus(X, B, Z))). isGreater(succ(X), zero). isGreater(succ(X), pred(Y)). isGreater(succ(X), succ(Y)) :- isGreater(X, Y). isGreater(zero, pred(Y)). isGreater(pred(X), pred(Y)) :- isGreater(X, Y). isLess(pred(X), zero). isLess(pred(X), succ(Y)). isLess(pred(X), pred(Y)) :- isLess(X, Y). isLess(zero, succ(Y)). isLess(succ(X), succ(Y)) :- isLess(X, Y). not(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3) :- ','(call(game_win_x(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))), ','(!, fail)). not(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3). not1(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3) :- ','(call(game_win_o(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))), ','(!, fail)). not1(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3). Directives: :- entry(play(Game), .(ground(Game), [])). :- trust(player(Player), [], .(ground(Player), [])). :- trust(abolish0(Player), [], .(ground(Player), [])). Query: play(g,g,a) ---------------------------------------- (17) CallTransformerProof (EQUIVALENT) Transformed all call-constructs [PROLOG]. ---------------------------------------- (18) Obligation: Clauses: play(Game) :- ','(initialize(Game, Position, Player), ','(display_game(Position), play(Position, Player, Result))). play(Position, Player, Result) :- ','(game_over(Position, Player, Result), ','(!, ','(write(Result), abolish0(player)))). play(Position, Player, Result) :- ','(choose(Position, Player, Move), ','(move(Move, Player, Position, Position1), ','(display_game(Position1), ','(next_player(Player, Player1), ','(!, play(Position1, Player1, Result)))))). choose(Position, computer, Move) :- ','(write('Computer is thinking...'), ','(nl, alpha_beta(computer, Position, pred(zero), succ(zero), Move, Value))). choose(Position, Player, Move) :- ','(write(Player), ','(write(', enter move (followed by a period and return) --> '), ','(read(Move1), legal(Position, Player, Move1, Move)))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(==(Player, computer), ','(game_win_o(Position), =(Value, succ(zero)))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(player(Player), ','(game_win_x(Position), =(Value, succ(zero)))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(game_tie(Position), =(Value, zero)). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(==(Player, computer), ','(game_win_x(Position), =(Value, pred(zero)))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(player(Player), ','(game_win_o(Position), =(Value, pred(zero)))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(setof(Move1, move(Position, Move1), Moves), ','(isMinus(zero1, Beta, U), ','(=(Alpha1, U), ','(isMinus(zero1, Alpha, U), ','(=(Beta1, U), evaluate(Player, Moves, Position, Alpha1, Beta1, nil, ','(Move, Value))))))). evaluate(Player, .(Move, Moves), Position, Alpha, Beta, Move1, Best) :- ','(move(Move, Player, Position, Position1), ','(next_player(Player, Player1), ','(alpha_beta(Player1, Position1, Alpha, Beta, MoveX, Value), ','(isMinus(zero1, Value, U), ','(=(Value1, U), ','(cutoff(Player, Move, Value1, Alpha, Beta, Moves, Position, Move1, Best), !)))))). evaluate(Player, [], Position, Alpha, Beta, Move, ','(Move, Alpha)). cutoff(Player, Move, Value, Alpha, Beta, Moves, Position, Move1, ','(Move, Value)) :- ','(=(X, Value), ','(=(X1, Beta), ','(;(isGreater(X, X1), =(X, X1)), !))). cutoff(Player, Move, Value, Alpha, Beta, Moves, Position, Move1, Best) :- ','(=(X, Alpha), ','(=(X1, Value), ','(isLess(X, X1), ','(=(X2, Value), ','(=(X3, Beta), ','(isLess(X2, X3), ','(!, evaluate(Player, Moves, Position, Value, Beta, Move, Best)))))))). cutoff(Player, Move, Value, Alpha, Beta, Moves, Position, Move1, Best) :- ','(=(X, Value), ','(=(X1, Alpha), ','(;(=(X, X1), isLess(X, X1)), ','(!, evaluate(Player, Moves, Position, Alpha, Beta, Move1, Best))))). initialize(tictactoe, ','(','(' ', ','(' ', ' ')), ','(','(' ', ','(' ', ' ')), ','(' ', ','(' ', ' ')))), Player) :- ','(write('Enter player`s name (followed by a period and return) --> '), ','(read(Player), ','(write(Player), ','(write(', you will go first and use the symbol "x".'), ','(nl, assert(player(Player))))))). display_game(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3))))) :- ','(nl, ','(write(' '), ','(write(R1C1), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R1C2), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R1C3), ','(write(' '), ','(tab(succ(succ(succ(zero)))), ','(write('u-l = upper left, u-c = upper center, u-r = upper right'), ','(nl, ','(write(' --+---+-- '), ','(nl, ','(write(' '), ','(write(R2C1), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R2C2), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R2C3), ','(write(' '), ','(tab(succ(succ(succ(zero)))), ','(write('c-l = center left, c-c = center center, c-r = center right'), ','(nl, ','(write(' --+---+-- '), ','(nl, ','(write(' '), ','(write(R3C1), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R3C2), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R3C3), ','(write(' '), ','(tab(succ(succ(succ(zero)))), ','(write('l-l = lower left, l-c = lower center, l-r = lower right'), ','(nl, nl))))))))))))))))))))))))))))))))))))))))))))))). next_player(Player, computer) :- player(Player). next_player(computer, Player1) :- player(Player1). legal(Position, Player, Move, Move) :- move(Position, Move). legal(Position, Player, Move1, Move) :- ','(write('Illegal move! '), ','(!, choose(Position, Player, Move))). game_over(Position, Player, ','(Player1, ' you win!')) :- ','(game_win_x(Position), player(Player1)). game_over(Position, Player, 'Computer wins!') :- game_win_o(Position). game_over(Position, Player, 'It is a tie!') :- game_tie(Position). game_tie(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3))))) :- ','(not(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3), ','(not1(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3), ','(\==(R1C1, ' '), ','(\==(R1C2, ' '), ','(\==(R1C3, ' '), ','(\==(R2C1, ' '), ','(\==(R2C2, ' '), ','(\==(R2C3, ' '), ','(\==(R3C1, ' '), ','(\==(R3C2, ' '), \==(R3C3, ' '))))))))))). game_win_x(','(','(x, ','(x, x)), ','(','(X1, ','(X2, X3)), ','(X4, ','(X5, X6))))). game_win_x(','(','(X7, ','(X8, X9)), ','(','(x, ','(x, x)), ','(X10, ','(X11, X12))))). game_win_x(','(','(X13, ','(X14, X15)), ','(','(X16, ','(X17, X18)), ','(x, ','(x, x))))). game_win_x(','(','(x, ','(X19, X20)), ','(','(x, ','(X21, X22)), ','(x, ','(X23, X24))))). game_win_x(','(','(X25, ','(x, X26)), ','(','(X27, ','(x, X28)), ','(X29, ','(x, X30))))). game_win_x(','(','(X31, ','(X32, x)), ','(','(X33, ','(X34, x)), ','(X35, ','(X36, x))))). game_win_x(','(','(x, ','(X37, X38)), ','(','(X39, ','(x, X40)), ','(X41, ','(X42, x))))). game_win_x(','(','(X43, ','(X44, x)), ','(','(X45, ','(x, X46)), ','(x, ','(X47, X48))))). game_win_o(','(','(o, ','(o, o)), ','(','(X49, ','(X50, X51)), ','(X52, ','(X53, X54))))). game_win_o(','(','(X55, ','(X56, X57)), ','(','(o, ','(o, o)), ','(X58, ','(X59, X60))))). game_win_o(','(','(X61, ','(X62, X63)), ','(','(X64, ','(X65, X66)), ','(o, ','(o, o))))). game_win_o(','(','(o, ','(X67, X68)), ','(','(o, ','(X69, X70)), ','(o, ','(X71, X72))))). game_win_o(','(','(X73, ','(o, X74)), ','(','(X75, ','(o, X76)), ','(X77, ','(o, X78))))). game_win_o(','(','(X79, ','(X80, o)), ','(','(X81, ','(X82, o)), ','(X83, ','(X84, o))))). game_win_o(','(','(o, ','(X85, X86)), ','(','(X87, ','(o, X88)), ','(X89, ','(X90, o))))). game_win_o(','(','(X91, ','(X92, o)), ','(','(X93, ','(o, X94)), ','(o, ','(X95, X96))))). move(','(','(' ', ','(X97, X98)), ','(','(X99, ','(X100, X101)), ','(X102, ','(X103, X104)))), -(u, l)). move(','(','(X105, ','(' ', X106)), ','(','(X107, ','(X108, X109)), ','(X110, ','(X111, X112)))), -(u, c)). move(','(','(X113, ','(X114, ' ')), ','(','(X115, ','(X116, X117)), ','(X118, ','(X119, X120)))), -(u, r)). move(','(','(X121, ','(X122, X123)), ','(','(' ', ','(X124, X125)), ','(X126, ','(X127, X128)))), -(c, l)). move(','(','(X129, ','(X130, X131)), ','(','(X132, ','(' ', X133)), ','(X134, ','(X135, X136)))), -(c, c)). move(','(','(X137, ','(X138, X139)), ','(','(X140, ','(X141, ' ')), ','(X142, ','(X143, X144)))), -(c, r)). move(','(','(X145, ','(X146, X147)), ','(','(X148, ','(X149, X150)), ','(' ', ','(X151, X152)))), -(l, l)). move(','(','(X153, ','(X154, X155)), ','(','(X156, ','(X157, X158)), ','(X159, ','(' ', X160)))), -(l, c)). move(','(','(X161, ','(X162, X163)), ','(','(X164, ','(X165, X166)), ','(X167, ','(X168, ' ')))), -(l, r)). move(-(u, l), computer, Position, Position1) :- ','(=(','(','(X169, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(o, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(u, c), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(X170, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(o, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(u, r), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, X171)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, o)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, l), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(X172, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(o, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, c), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(X173, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(o, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, r), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, X174)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, o)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(l, l), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(X175, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(o, ','(R3C2, R3C3)))))). move(-(l, c), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(X176, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(o, R3C3)))))). move(-(l, r), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, X177)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, o)))))). move(-(u, l), Player, Position, Position1) :- ','(=(','(','(X178, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(x, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(u, c), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(X179, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(x, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(u, r), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, X180)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, x)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, l), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(X181, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(x, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, c), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(X182, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(x, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, r), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, X183)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, x)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(l, l), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(X184, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(x, ','(R3C2, R3C3)))))). move(-(l, c), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(X185, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(x, R3C3)))))). move(-(l, r), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, X186)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, x)))))). isPlus(zero, X, X). isPlus(succ(X), zero, succ(X)). isPlus(succ(X), succ(Y), succ(succ(Z))) :- isPlus(X, Y, Z). isPlus(succ(X), pred(Y), Z) :- isPlus(X, Y, Z). isPlus(pred(X), zero, pred(X)). isPlus(pred(X), succ(Y), Z) :- isPlus(X, Y, Z). isPlus(pred(X), pred(Y), pred(pred(Z))) :- isPlus(X, Y, Z). isMinus(X, zero, X). isMinus(zero, succ(Y), pred(Z)) :- isMinus(zero, Y, Z). isMinus(zero, pred(Y), succ(Z)) :- isMinus(zero, Y, Z). isMinus(succ(X), succ(Y), Z) :- isMinus(X, Y, Z). isMinus(succ(X), pred(Y), succ(succ(Z))) :- isMinus(X, Y, Z). isMinus(pred(X), succ(Y), pred(pred(Z))) :- isMinus(X, Y, Z). isMinus(pred(X), pred(Y), Z) :- isMinus(X, Y, Z). isTimes(X, zero, zero). isTimes(zero, succ(Y), zero). isTimes(zero, pred(Y), zero). isTimes(succ(X), succ(Y), Z) :- ','(isTimes(succ(X), Y, A), isPlus(A, succ(X), Z)). isTimes(succ(X), pred(Y), Z) :- ','(isTimes(succ(X), Y, A), isMinus(A, succ(X), Z)). isTimes(pred(X), succ(Y), Z) :- ','(isTimes(pred(X), Y, A), isPlus(A, pred(X), Z)). isTimes(pred(X), pred(Y), Z) :- ','(isTimes(pred(X), Y, A), isMinus(A, pred(X), Z)). isDiv(zero, succ(Y), zero). isDiv(zero, pred(Y), zero). isDiv(succ(X), succ(Y), zero) :- isMinus(succ(X), succ(Y), pred(Z)). isDiv(succ(X), succ(Y), succ(Z)) :- ','(isMinus(succ(X), succ(Y), A), isDiv(A, succ(Y), Z)). isDiv(succ(X), pred(Y), Z) :- ','(isMinus(zero, pred(Y), A), ','(isDiv(succ(X), A, B), isMinus(zero, B, Z))). isDiv(pred(X), pred(Y), zero) :- isMinus(pred(X), pred(Y), succ(Z)). isDiv(pred(X), pred(Y), succ(Z)) :- ','(isMinus(pred(X), pred(Y), A), isDiv(A, pred(Y), Z)). isDiv(pred(X), succ(Y), Z) :- ','(isMinus(zero, pred(X), A), ','(isDiv(A, succ(Y), B), isMinus(zero, B, Z))). isModulo(X, Y, Z) :- ','(isDiv(X, Y, A), ','(isTimes(A, Y, B), isMinus(X, B, Z))). isGreater(succ(X), zero). isGreater(succ(X), pred(Y)). isGreater(succ(X), succ(Y)) :- isGreater(X, Y). isGreater(zero, pred(Y)). isGreater(pred(X), pred(Y)) :- isGreater(X, Y). isLess(pred(X), zero). isLess(pred(X), succ(Y)). isLess(pred(X), pred(Y)) :- isLess(X, Y). isLess(zero, succ(Y)). isLess(succ(X), succ(Y)) :- isLess(X, Y). not(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3) :- ','(call1(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3), ','(!, fail)). not(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3). not1(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3) :- ','(call2(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3), ','(!, fail)). not1(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3). call1(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3) :- game_win_x(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3))))). call2(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3) :- game_win_o(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3))))). Directives: :- entry(play(Game), .(ground(Game), [])). :- trust(player(Player), [], .(ground(Player), [])). :- trust(abolish0(Player), [], .(ground(Player), [])). Query: play(g,g,a) ---------------------------------------- (19) CutEliminatorProof (SOUND) Eliminated all cuts by simply ignoring them[PROLOG]. ---------------------------------------- (20) Obligation: Clauses: play(Game) :- ','(initialize(Game, Position, Player), ','(display_game(Position), play(Position, Player, Result))). play(Position, Player, Result) :- ','(game_over(Position, Player, Result), ','(write(Result), abolish0(player))). play(Position, Player, Result) :- ','(choose(Position, Player, Move), ','(move(Move, Player, Position, Position1), ','(display_game(Position1), ','(next_player(Player, Player1), play(Position1, Player1, Result))))). choose(Position, computer, Move) :- ','(write('Computer is thinking...'), ','(nl, alpha_beta(computer, Position, pred(zero), succ(zero), Move, Value))). choose(Position, Player, Move) :- ','(write(Player), ','(write(', enter move (followed by a period and return) --> '), ','(read(Move1), legal(Position, Player, Move1, Move)))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(==(Player, computer), ','(game_win_o(Position), =(Value, succ(zero)))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(player(Player), ','(game_win_x(Position), =(Value, succ(zero)))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(game_tie(Position), =(Value, zero)). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(==(Player, computer), ','(game_win_x(Position), =(Value, pred(zero)))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(player(Player), ','(game_win_o(Position), =(Value, pred(zero)))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(setof(Move1, move(Position, Move1), Moves), ','(isMinus(zero1, Beta, U), ','(=(Alpha1, U), ','(isMinus(zero1, Alpha, U), ','(=(Beta1, U), evaluate(Player, Moves, Position, Alpha1, Beta1, nil, ','(Move, Value))))))). evaluate(Player, .(Move, Moves), Position, Alpha, Beta, Move1, Best) :- ','(move(Move, Player, Position, Position1), ','(next_player(Player, Player1), ','(alpha_beta(Player1, Position1, Alpha, Beta, MoveX, Value), ','(isMinus(zero1, Value, U), ','(=(Value1, U), cutoff(Player, Move, Value1, Alpha, Beta, Moves, Position, Move1, Best)))))). evaluate(Player, [], Position, Alpha, Beta, Move, ','(Move, Alpha)). cutoff(Player, Move, Value, Alpha, Beta, Moves, Position, Move1, ','(Move, Value)) :- ','(=(X, Value), ','(=(X1, Beta), ;(isGreater(X, X1), =(X, X1)))). cutoff(Player, Move, Value, Alpha, Beta, Moves, Position, Move1, Best) :- ','(=(X, Alpha), ','(=(X1, Value), ','(isLess(X, X1), ','(=(X2, Value), ','(=(X3, Beta), ','(isLess(X2, X3), evaluate(Player, Moves, Position, Value, Beta, Move, Best))))))). cutoff(Player, Move, Value, Alpha, Beta, Moves, Position, Move1, Best) :- ','(=(X, Value), ','(=(X1, Alpha), ','(;(=(X, X1), isLess(X, X1)), evaluate(Player, Moves, Position, Alpha, Beta, Move1, Best)))). initialize(tictactoe, ','(','(' ', ','(' ', ' ')), ','(','(' ', ','(' ', ' ')), ','(' ', ','(' ', ' ')))), Player) :- ','(write('Enter player`s name (followed by a period and return) --> '), ','(read(Player), ','(write(Player), ','(write(', you will go first and use the symbol "x".'), ','(nl, assert(player(Player))))))). display_game(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3))))) :- ','(nl, ','(write(' '), ','(write(R1C1), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R1C2), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R1C3), ','(write(' '), ','(tab(succ(succ(succ(zero)))), ','(write('u-l = upper left, u-c = upper center, u-r = upper right'), ','(nl, ','(write(' --+---+-- '), ','(nl, ','(write(' '), ','(write(R2C1), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R2C2), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R2C3), ','(write(' '), ','(tab(succ(succ(succ(zero)))), ','(write('c-l = center left, c-c = center center, c-r = center right'), ','(nl, ','(write(' --+---+-- '), ','(nl, ','(write(' '), ','(write(R3C1), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R3C2), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R3C3), ','(write(' '), ','(tab(succ(succ(succ(zero)))), ','(write('l-l = lower left, l-c = lower center, l-r = lower right'), ','(nl, nl))))))))))))))))))))))))))))))))))))))))))))))). next_player(Player, computer) :- player(Player). next_player(computer, Player1) :- player(Player1). legal(Position, Player, Move, Move) :- move(Position, Move). legal(Position, Player, Move1, Move) :- ','(write('Illegal move! '), choose(Position, Player, Move)). game_over(Position, Player, ','(Player1, ' you win!')) :- ','(game_win_x(Position), player(Player1)). game_over(Position, Player, 'Computer wins!') :- game_win_o(Position). game_over(Position, Player, 'It is a tie!') :- game_tie(Position). game_tie(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3))))) :- ','(not(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3), ','(not1(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3), ','(\==(R1C1, ' '), ','(\==(R1C2, ' '), ','(\==(R1C3, ' '), ','(\==(R2C1, ' '), ','(\==(R2C2, ' '), ','(\==(R2C3, ' '), ','(\==(R3C1, ' '), ','(\==(R3C2, ' '), \==(R3C3, ' '))))))))))). game_win_x(','(','(x, ','(x, x)), ','(','(X1, ','(X2, X3)), ','(X4, ','(X5, X6))))). game_win_x(','(','(X7, ','(X8, X9)), ','(','(x, ','(x, x)), ','(X10, ','(X11, X12))))). game_win_x(','(','(X13, ','(X14, X15)), ','(','(X16, ','(X17, X18)), ','(x, ','(x, x))))). game_win_x(','(','(x, ','(X19, X20)), ','(','(x, ','(X21, X22)), ','(x, ','(X23, X24))))). game_win_x(','(','(X25, ','(x, X26)), ','(','(X27, ','(x, X28)), ','(X29, ','(x, X30))))). game_win_x(','(','(X31, ','(X32, x)), ','(','(X33, ','(X34, x)), ','(X35, ','(X36, x))))). game_win_x(','(','(x, ','(X37, X38)), ','(','(X39, ','(x, X40)), ','(X41, ','(X42, x))))). game_win_x(','(','(X43, ','(X44, x)), ','(','(X45, ','(x, X46)), ','(x, ','(X47, X48))))). game_win_o(','(','(o, ','(o, o)), ','(','(X49, ','(X50, X51)), ','(X52, ','(X53, X54))))). game_win_o(','(','(X55, ','(X56, X57)), ','(','(o, ','(o, o)), ','(X58, ','(X59, X60))))). game_win_o(','(','(X61, ','(X62, X63)), ','(','(X64, ','(X65, X66)), ','(o, ','(o, o))))). game_win_o(','(','(o, ','(X67, X68)), ','(','(o, ','(X69, X70)), ','(o, ','(X71, X72))))). game_win_o(','(','(X73, ','(o, X74)), ','(','(X75, ','(o, X76)), ','(X77, ','(o, X78))))). game_win_o(','(','(X79, ','(X80, o)), ','(','(X81, ','(X82, o)), ','(X83, ','(X84, o))))). game_win_o(','(','(o, ','(X85, X86)), ','(','(X87, ','(o, X88)), ','(X89, ','(X90, o))))). game_win_o(','(','(X91, ','(X92, o)), ','(','(X93, ','(o, X94)), ','(o, ','(X95, X96))))). move(','(','(' ', ','(X97, X98)), ','(','(X99, ','(X100, X101)), ','(X102, ','(X103, X104)))), -(u, l)). move(','(','(X105, ','(' ', X106)), ','(','(X107, ','(X108, X109)), ','(X110, ','(X111, X112)))), -(u, c)). move(','(','(X113, ','(X114, ' ')), ','(','(X115, ','(X116, X117)), ','(X118, ','(X119, X120)))), -(u, r)). move(','(','(X121, ','(X122, X123)), ','(','(' ', ','(X124, X125)), ','(X126, ','(X127, X128)))), -(c, l)). move(','(','(X129, ','(X130, X131)), ','(','(X132, ','(' ', X133)), ','(X134, ','(X135, X136)))), -(c, c)). move(','(','(X137, ','(X138, X139)), ','(','(X140, ','(X141, ' ')), ','(X142, ','(X143, X144)))), -(c, r)). move(','(','(X145, ','(X146, X147)), ','(','(X148, ','(X149, X150)), ','(' ', ','(X151, X152)))), -(l, l)). move(','(','(X153, ','(X154, X155)), ','(','(X156, ','(X157, X158)), ','(X159, ','(' ', X160)))), -(l, c)). move(','(','(X161, ','(X162, X163)), ','(','(X164, ','(X165, X166)), ','(X167, ','(X168, ' ')))), -(l, r)). move(-(u, l), computer, Position, Position1) :- ','(=(','(','(X169, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(o, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(u, c), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(X170, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(o, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(u, r), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, X171)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, o)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, l), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(X172, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(o, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, c), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(X173, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(o, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, r), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, X174)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, o)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(l, l), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(X175, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(o, ','(R3C2, R3C3)))))). move(-(l, c), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(X176, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(o, R3C3)))))). move(-(l, r), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, X177)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, o)))))). move(-(u, l), Player, Position, Position1) :- ','(=(','(','(X178, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(x, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(u, c), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(X179, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(x, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(u, r), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, X180)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, x)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, l), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(X181, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(x, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, c), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(X182, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(x, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, r), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, X183)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, x)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(l, l), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(X184, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(x, ','(R3C2, R3C3)))))). move(-(l, c), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(X185, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(x, R3C3)))))). move(-(l, r), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, X186)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, x)))))). isPlus(zero, X, X). isPlus(succ(X), zero, succ(X)). isPlus(succ(X), succ(Y), succ(succ(Z))) :- isPlus(X, Y, Z). isPlus(succ(X), pred(Y), Z) :- isPlus(X, Y, Z). isPlus(pred(X), zero, pred(X)). isPlus(pred(X), succ(Y), Z) :- isPlus(X, Y, Z). isPlus(pred(X), pred(Y), pred(pred(Z))) :- isPlus(X, Y, Z). isMinus(X, zero, X). isMinus(zero, succ(Y), pred(Z)) :- isMinus(zero, Y, Z). isMinus(zero, pred(Y), succ(Z)) :- isMinus(zero, Y, Z). isMinus(succ(X), succ(Y), Z) :- isMinus(X, Y, Z). isMinus(succ(X), pred(Y), succ(succ(Z))) :- isMinus(X, Y, Z). isMinus(pred(X), succ(Y), pred(pred(Z))) :- isMinus(X, Y, Z). isMinus(pred(X), pred(Y), Z) :- isMinus(X, Y, Z). isTimes(X, zero, zero). isTimes(zero, succ(Y), zero). isTimes(zero, pred(Y), zero). isTimes(succ(X), succ(Y), Z) :- ','(isTimes(succ(X), Y, A), isPlus(A, succ(X), Z)). isTimes(succ(X), pred(Y), Z) :- ','(isTimes(succ(X), Y, A), isMinus(A, succ(X), Z)). isTimes(pred(X), succ(Y), Z) :- ','(isTimes(pred(X), Y, A), isPlus(A, pred(X), Z)). isTimes(pred(X), pred(Y), Z) :- ','(isTimes(pred(X), Y, A), isMinus(A, pred(X), Z)). isDiv(zero, succ(Y), zero). isDiv(zero, pred(Y), zero). isDiv(succ(X), succ(Y), zero) :- isMinus(succ(X), succ(Y), pred(Z)). isDiv(succ(X), succ(Y), succ(Z)) :- ','(isMinus(succ(X), succ(Y), A), isDiv(A, succ(Y), Z)). isDiv(succ(X), pred(Y), Z) :- ','(isMinus(zero, pred(Y), A), ','(isDiv(succ(X), A, B), isMinus(zero, B, Z))). isDiv(pred(X), pred(Y), zero) :- isMinus(pred(X), pred(Y), succ(Z)). isDiv(pred(X), pred(Y), succ(Z)) :- ','(isMinus(pred(X), pred(Y), A), isDiv(A, pred(Y), Z)). isDiv(pred(X), succ(Y), Z) :- ','(isMinus(zero, pred(X), A), ','(isDiv(A, succ(Y), B), isMinus(zero, B, Z))). isModulo(X, Y, Z) :- ','(isDiv(X, Y, A), ','(isTimes(A, Y, B), isMinus(X, B, Z))). isGreater(succ(X), zero). isGreater(succ(X), pred(Y)). isGreater(succ(X), succ(Y)) :- isGreater(X, Y). isGreater(zero, pred(Y)). isGreater(pred(X), pred(Y)) :- isGreater(X, Y). isLess(pred(X), zero). isLess(pred(X), succ(Y)). isLess(pred(X), pred(Y)) :- isLess(X, Y). isLess(zero, succ(Y)). isLess(succ(X), succ(Y)) :- isLess(X, Y). not(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3) :- ','(call1(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3), fail). not(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3). not1(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3) :- ','(call2(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3), fail). not1(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3). call1(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3) :- game_win_x(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3))))). call2(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3) :- game_win_o(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3))))). Directives: :- entry(play(Game), .(ground(Game), [])). :- trust(player(Player), [], .(ground(Player), [])). :- trust(abolish0(Player), [], .(ground(Player), [])). Query: play(g,g,a) ---------------------------------------- (21) FailTransformerProof (EQUIVALENT) Added clauses for the built-in fail predicate [PROLOG]. ---------------------------------------- (22) Obligation: Clauses: play(Game) :- ','(initialize(Game, Position, Player), ','(display_game(Position), play(Position, Player, Result))). play(Position, Player, Result) :- ','(game_over(Position, Player, Result), ','(write(Result), abolish0(player))). play(Position, Player, Result) :- ','(choose(Position, Player, Move), ','(move(Move, Player, Position, Position1), ','(display_game(Position1), ','(next_player(Player, Player1), play(Position1, Player1, Result))))). choose(Position, computer, Move) :- ','(write('Computer is thinking...'), ','(nl, alpha_beta(computer, Position, pred(zero), succ(zero), Move, Value))). choose(Position, Player, Move) :- ','(write(Player), ','(write(', enter move (followed by a period and return) --> '), ','(read(Move1), legal(Position, Player, Move1, Move)))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(==(Player, computer), ','(game_win_o(Position), =(Value, succ(zero)))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(player(Player), ','(game_win_x(Position), =(Value, succ(zero)))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(game_tie(Position), =(Value, zero)). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(==(Player, computer), ','(game_win_x(Position), =(Value, pred(zero)))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(player(Player), ','(game_win_o(Position), =(Value, pred(zero)))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(setof(Move1, move(Position, Move1), Moves), ','(isMinus(zero1, Beta, U), ','(=(Alpha1, U), ','(isMinus(zero1, Alpha, U), ','(=(Beta1, U), evaluate(Player, Moves, Position, Alpha1, Beta1, nil, ','(Move, Value))))))). evaluate(Player, .(Move, Moves), Position, Alpha, Beta, Move1, Best) :- ','(move(Move, Player, Position, Position1), ','(next_player(Player, Player1), ','(alpha_beta(Player1, Position1, Alpha, Beta, MoveX, Value), ','(isMinus(zero1, Value, U), ','(=(Value1, U), cutoff(Player, Move, Value1, Alpha, Beta, Moves, Position, Move1, Best)))))). evaluate(Player, [], Position, Alpha, Beta, Move, ','(Move, Alpha)). cutoff(Player, Move, Value, Alpha, Beta, Moves, Position, Move1, ','(Move, Value)) :- ','(=(X, Value), ','(=(X1, Beta), ;(isGreater(X, X1), =(X, X1)))). cutoff(Player, Move, Value, Alpha, Beta, Moves, Position, Move1, Best) :- ','(=(X, Alpha), ','(=(X1, Value), ','(isLess(X, X1), ','(=(X2, Value), ','(=(X3, Beta), ','(isLess(X2, X3), evaluate(Player, Moves, Position, Value, Beta, Move, Best))))))). cutoff(Player, Move, Value, Alpha, Beta, Moves, Position, Move1, Best) :- ','(=(X, Value), ','(=(X1, Alpha), ','(;(=(X, X1), isLess(X, X1)), evaluate(Player, Moves, Position, Alpha, Beta, Move1, Best)))). initialize(tictactoe, ','(','(' ', ','(' ', ' ')), ','(','(' ', ','(' ', ' ')), ','(' ', ','(' ', ' ')))), Player) :- ','(write('Enter player`s name (followed by a period and return) --> '), ','(read(Player), ','(write(Player), ','(write(', you will go first and use the symbol "x".'), ','(nl, assert(player(Player))))))). display_game(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3))))) :- ','(nl, ','(write(' '), ','(write(R1C1), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R1C2), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R1C3), ','(write(' '), ','(tab(succ(succ(succ(zero)))), ','(write('u-l = upper left, u-c = upper center, u-r = upper right'), ','(nl, ','(write(' --+---+-- '), ','(nl, ','(write(' '), ','(write(R2C1), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R2C2), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R2C3), ','(write(' '), ','(tab(succ(succ(succ(zero)))), ','(write('c-l = center left, c-c = center center, c-r = center right'), ','(nl, ','(write(' --+---+-- '), ','(nl, ','(write(' '), ','(write(R3C1), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R3C2), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R3C3), ','(write(' '), ','(tab(succ(succ(succ(zero)))), ','(write('l-l = lower left, l-c = lower center, l-r = lower right'), ','(nl, nl))))))))))))))))))))))))))))))))))))))))))))))). next_player(Player, computer) :- player(Player). next_player(computer, Player1) :- player(Player1). legal(Position, Player, Move, Move) :- move(Position, Move). legal(Position, Player, Move1, Move) :- ','(write('Illegal move! '), choose(Position, Player, Move)). game_over(Position, Player, ','(Player1, ' you win!')) :- ','(game_win_x(Position), player(Player1)). game_over(Position, Player, 'Computer wins!') :- game_win_o(Position). game_over(Position, Player, 'It is a tie!') :- game_tie(Position). game_tie(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3))))) :- ','(not(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3), ','(not1(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3), ','(\==(R1C1, ' '), ','(\==(R1C2, ' '), ','(\==(R1C3, ' '), ','(\==(R2C1, ' '), ','(\==(R2C2, ' '), ','(\==(R2C3, ' '), ','(\==(R3C1, ' '), ','(\==(R3C2, ' '), \==(R3C3, ' '))))))))))). game_win_x(','(','(x, ','(x, x)), ','(','(X1, ','(X2, X3)), ','(X4, ','(X5, X6))))). game_win_x(','(','(X7, ','(X8, X9)), ','(','(x, ','(x, x)), ','(X10, ','(X11, X12))))). game_win_x(','(','(X13, ','(X14, X15)), ','(','(X16, ','(X17, X18)), ','(x, ','(x, x))))). game_win_x(','(','(x, ','(X19, X20)), ','(','(x, ','(X21, X22)), ','(x, ','(X23, X24))))). game_win_x(','(','(X25, ','(x, X26)), ','(','(X27, ','(x, X28)), ','(X29, ','(x, X30))))). game_win_x(','(','(X31, ','(X32, x)), ','(','(X33, ','(X34, x)), ','(X35, ','(X36, x))))). game_win_x(','(','(x, ','(X37, X38)), ','(','(X39, ','(x, X40)), ','(X41, ','(X42, x))))). game_win_x(','(','(X43, ','(X44, x)), ','(','(X45, ','(x, X46)), ','(x, ','(X47, X48))))). game_win_o(','(','(o, ','(o, o)), ','(','(X49, ','(X50, X51)), ','(X52, ','(X53, X54))))). game_win_o(','(','(X55, ','(X56, X57)), ','(','(o, ','(o, o)), ','(X58, ','(X59, X60))))). game_win_o(','(','(X61, ','(X62, X63)), ','(','(X64, ','(X65, X66)), ','(o, ','(o, o))))). game_win_o(','(','(o, ','(X67, X68)), ','(','(o, ','(X69, X70)), ','(o, ','(X71, X72))))). game_win_o(','(','(X73, ','(o, X74)), ','(','(X75, ','(o, X76)), ','(X77, ','(o, X78))))). game_win_o(','(','(X79, ','(X80, o)), ','(','(X81, ','(X82, o)), ','(X83, ','(X84, o))))). game_win_o(','(','(o, ','(X85, X86)), ','(','(X87, ','(o, X88)), ','(X89, ','(X90, o))))). game_win_o(','(','(X91, ','(X92, o)), ','(','(X93, ','(o, X94)), ','(o, ','(X95, X96))))). move(','(','(' ', ','(X97, X98)), ','(','(X99, ','(X100, X101)), ','(X102, ','(X103, X104)))), -(u, l)). move(','(','(X105, ','(' ', X106)), ','(','(X107, ','(X108, X109)), ','(X110, ','(X111, X112)))), -(u, c)). move(','(','(X113, ','(X114, ' ')), ','(','(X115, ','(X116, X117)), ','(X118, ','(X119, X120)))), -(u, r)). move(','(','(X121, ','(X122, X123)), ','(','(' ', ','(X124, X125)), ','(X126, ','(X127, X128)))), -(c, l)). move(','(','(X129, ','(X130, X131)), ','(','(X132, ','(' ', X133)), ','(X134, ','(X135, X136)))), -(c, c)). move(','(','(X137, ','(X138, X139)), ','(','(X140, ','(X141, ' ')), ','(X142, ','(X143, X144)))), -(c, r)). move(','(','(X145, ','(X146, X147)), ','(','(X148, ','(X149, X150)), ','(' ', ','(X151, X152)))), -(l, l)). move(','(','(X153, ','(X154, X155)), ','(','(X156, ','(X157, X158)), ','(X159, ','(' ', X160)))), -(l, c)). move(','(','(X161, ','(X162, X163)), ','(','(X164, ','(X165, X166)), ','(X167, ','(X168, ' ')))), -(l, r)). move(-(u, l), computer, Position, Position1) :- ','(=(','(','(X169, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(o, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(u, c), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(X170, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(o, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(u, r), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, X171)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, o)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, l), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(X172, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(o, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, c), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(X173, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(o, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, r), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, X174)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, o)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(l, l), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(X175, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(o, ','(R3C2, R3C3)))))). move(-(l, c), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(X176, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(o, R3C3)))))). move(-(l, r), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, X177)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, o)))))). move(-(u, l), Player, Position, Position1) :- ','(=(','(','(X178, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(x, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(u, c), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(X179, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(x, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(u, r), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, X180)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, x)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, l), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(X181, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(x, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, c), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(X182, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(x, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, r), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, X183)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, x)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(l, l), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(X184, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(x, ','(R3C2, R3C3)))))). move(-(l, c), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(X185, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(x, R3C3)))))). move(-(l, r), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, X186)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, x)))))). isPlus(zero, X, X). isPlus(succ(X), zero, succ(X)). isPlus(succ(X), succ(Y), succ(succ(Z))) :- isPlus(X, Y, Z). isPlus(succ(X), pred(Y), Z) :- isPlus(X, Y, Z). isPlus(pred(X), zero, pred(X)). isPlus(pred(X), succ(Y), Z) :- isPlus(X, Y, Z). isPlus(pred(X), pred(Y), pred(pred(Z))) :- isPlus(X, Y, Z). isMinus(X, zero, X). isMinus(zero, succ(Y), pred(Z)) :- isMinus(zero, Y, Z). isMinus(zero, pred(Y), succ(Z)) :- isMinus(zero, Y, Z). isMinus(succ(X), succ(Y), Z) :- isMinus(X, Y, Z). isMinus(succ(X), pred(Y), succ(succ(Z))) :- isMinus(X, Y, Z). isMinus(pred(X), succ(Y), pred(pred(Z))) :- isMinus(X, Y, Z). isMinus(pred(X), pred(Y), Z) :- isMinus(X, Y, Z). isTimes(X, zero, zero). isTimes(zero, succ(Y), zero). isTimes(zero, pred(Y), zero). isTimes(succ(X), succ(Y), Z) :- ','(isTimes(succ(X), Y, A), isPlus(A, succ(X), Z)). isTimes(succ(X), pred(Y), Z) :- ','(isTimes(succ(X), Y, A), isMinus(A, succ(X), Z)). isTimes(pred(X), succ(Y), Z) :- ','(isTimes(pred(X), Y, A), isPlus(A, pred(X), Z)). isTimes(pred(X), pred(Y), Z) :- ','(isTimes(pred(X), Y, A), isMinus(A, pred(X), Z)). isDiv(zero, succ(Y), zero). isDiv(zero, pred(Y), zero). isDiv(succ(X), succ(Y), zero) :- isMinus(succ(X), succ(Y), pred(Z)). isDiv(succ(X), succ(Y), succ(Z)) :- ','(isMinus(succ(X), succ(Y), A), isDiv(A, succ(Y), Z)). isDiv(succ(X), pred(Y), Z) :- ','(isMinus(zero, pred(Y), A), ','(isDiv(succ(X), A, B), isMinus(zero, B, Z))). isDiv(pred(X), pred(Y), zero) :- isMinus(pred(X), pred(Y), succ(Z)). isDiv(pred(X), pred(Y), succ(Z)) :- ','(isMinus(pred(X), pred(Y), A), isDiv(A, pred(Y), Z)). isDiv(pred(X), succ(Y), Z) :- ','(isMinus(zero, pred(X), A), ','(isDiv(A, succ(Y), B), isMinus(zero, B, Z))). isModulo(X, Y, Z) :- ','(isDiv(X, Y, A), ','(isTimes(A, Y, B), isMinus(X, B, Z))). isGreater(succ(X), zero). isGreater(succ(X), pred(Y)). isGreater(succ(X), succ(Y)) :- isGreater(X, Y). isGreater(zero, pred(Y)). isGreater(pred(X), pred(Y)) :- isGreater(X, Y). isLess(pred(X), zero). isLess(pred(X), succ(Y)). isLess(pred(X), pred(Y)) :- isLess(X, Y). isLess(zero, succ(Y)). isLess(succ(X), succ(Y)) :- isLess(X, Y). not(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3) :- ','(call1(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3), fail). not(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3). not1(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3) :- ','(call2(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3), fail). not1(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3). call1(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3) :- game_win_x(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3))))). call2(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3) :- game_win_o(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3))))). fail :- failure(a). failure(b). Directives: :- entry(play(Game), .(ground(Game), [])). :- trust(player(Player), [], .(ground(Player), [])). :- trust(abolish0(Player), [], .(ground(Player), [])). Query: play(g,g,a) ---------------------------------------- (23) UnifyTransformerProof (EQUIVALENT) Added a fact for the built-in = predicate [PROLOG]. ---------------------------------------- (24) Obligation: Clauses: play(Game) :- ','(initialize(Game, Position, Player), ','(display_game(Position), play(Position, Player, Result))). play(Position, Player, Result) :- ','(game_over(Position, Player, Result), ','(write(Result), abolish0(player))). play(Position, Player, Result) :- ','(choose(Position, Player, Move), ','(move(Move, Player, Position, Position1), ','(display_game(Position1), ','(next_player(Player, Player1), play(Position1, Player1, Result))))). choose(Position, computer, Move) :- ','(write('Computer is thinking...'), ','(nl, alpha_beta(computer, Position, pred(zero), succ(zero), Move, Value))). choose(Position, Player, Move) :- ','(write(Player), ','(write(', enter move (followed by a period and return) --> '), ','(read(Move1), legal(Position, Player, Move1, Move)))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(==(Player, computer), ','(game_win_o(Position), =(Value, succ(zero)))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(player(Player), ','(game_win_x(Position), =(Value, succ(zero)))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(game_tie(Position), =(Value, zero)). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(==(Player, computer), ','(game_win_x(Position), =(Value, pred(zero)))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(player(Player), ','(game_win_o(Position), =(Value, pred(zero)))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(setof(Move1, move(Position, Move1), Moves), ','(isMinus(zero1, Beta, U), ','(=(Alpha1, U), ','(isMinus(zero1, Alpha, U), ','(=(Beta1, U), evaluate(Player, Moves, Position, Alpha1, Beta1, nil, ','(Move, Value))))))). evaluate(Player, .(Move, Moves), Position, Alpha, Beta, Move1, Best) :- ','(move(Move, Player, Position, Position1), ','(next_player(Player, Player1), ','(alpha_beta(Player1, Position1, Alpha, Beta, MoveX, Value), ','(isMinus(zero1, Value, U), ','(=(Value1, U), cutoff(Player, Move, Value1, Alpha, Beta, Moves, Position, Move1, Best)))))). evaluate(Player, [], Position, Alpha, Beta, Move, ','(Move, Alpha)). cutoff(Player, Move, Value, Alpha, Beta, Moves, Position, Move1, ','(Move, Value)) :- ','(=(X, Value), ','(=(X1, Beta), ;(isGreater(X, X1), =(X, X1)))). cutoff(Player, Move, Value, Alpha, Beta, Moves, Position, Move1, Best) :- ','(=(X, Alpha), ','(=(X1, Value), ','(isLess(X, X1), ','(=(X2, Value), ','(=(X3, Beta), ','(isLess(X2, X3), evaluate(Player, Moves, Position, Value, Beta, Move, Best))))))). cutoff(Player, Move, Value, Alpha, Beta, Moves, Position, Move1, Best) :- ','(=(X, Value), ','(=(X1, Alpha), ','(;(=(X, X1), isLess(X, X1)), evaluate(Player, Moves, Position, Alpha, Beta, Move1, Best)))). initialize(tictactoe, ','(','(' ', ','(' ', ' ')), ','(','(' ', ','(' ', ' ')), ','(' ', ','(' ', ' ')))), Player) :- ','(write('Enter player`s name (followed by a period and return) --> '), ','(read(Player), ','(write(Player), ','(write(', you will go first and use the symbol "x".'), ','(nl, assert(player(Player))))))). display_game(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3))))) :- ','(nl, ','(write(' '), ','(write(R1C1), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R1C2), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R1C3), ','(write(' '), ','(tab(succ(succ(succ(zero)))), ','(write('u-l = upper left, u-c = upper center, u-r = upper right'), ','(nl, ','(write(' --+---+-- '), ','(nl, ','(write(' '), ','(write(R2C1), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R2C2), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R2C3), ','(write(' '), ','(tab(succ(succ(succ(zero)))), ','(write('c-l = center left, c-c = center center, c-r = center right'), ','(nl, ','(write(' --+---+-- '), ','(nl, ','(write(' '), ','(write(R3C1), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R3C2), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R3C3), ','(write(' '), ','(tab(succ(succ(succ(zero)))), ','(write('l-l = lower left, l-c = lower center, l-r = lower right'), ','(nl, nl))))))))))))))))))))))))))))))))))))))))))))))). next_player(Player, computer) :- player(Player). next_player(computer, Player1) :- player(Player1). legal(Position, Player, Move, Move) :- move(Position, Move). legal(Position, Player, Move1, Move) :- ','(write('Illegal move! '), choose(Position, Player, Move)). game_over(Position, Player, ','(Player1, ' you win!')) :- ','(game_win_x(Position), player(Player1)). game_over(Position, Player, 'Computer wins!') :- game_win_o(Position). game_over(Position, Player, 'It is a tie!') :- game_tie(Position). game_tie(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3))))) :- ','(not(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3), ','(not1(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3), ','(\==(R1C1, ' '), ','(\==(R1C2, ' '), ','(\==(R1C3, ' '), ','(\==(R2C1, ' '), ','(\==(R2C2, ' '), ','(\==(R2C3, ' '), ','(\==(R3C1, ' '), ','(\==(R3C2, ' '), \==(R3C3, ' '))))))))))). game_win_x(','(','(x, ','(x, x)), ','(','(X1, ','(X2, X3)), ','(X4, ','(X5, X6))))). game_win_x(','(','(X7, ','(X8, X9)), ','(','(x, ','(x, x)), ','(X10, ','(X11, X12))))). game_win_x(','(','(X13, ','(X14, X15)), ','(','(X16, ','(X17, X18)), ','(x, ','(x, x))))). game_win_x(','(','(x, ','(X19, X20)), ','(','(x, ','(X21, X22)), ','(x, ','(X23, X24))))). game_win_x(','(','(X25, ','(x, X26)), ','(','(X27, ','(x, X28)), ','(X29, ','(x, X30))))). game_win_x(','(','(X31, ','(X32, x)), ','(','(X33, ','(X34, x)), ','(X35, ','(X36, x))))). game_win_x(','(','(x, ','(X37, X38)), ','(','(X39, ','(x, X40)), ','(X41, ','(X42, x))))). game_win_x(','(','(X43, ','(X44, x)), ','(','(X45, ','(x, X46)), ','(x, ','(X47, X48))))). game_win_o(','(','(o, ','(o, o)), ','(','(X49, ','(X50, X51)), ','(X52, ','(X53, X54))))). game_win_o(','(','(X55, ','(X56, X57)), ','(','(o, ','(o, o)), ','(X58, ','(X59, X60))))). game_win_o(','(','(X61, ','(X62, X63)), ','(','(X64, ','(X65, X66)), ','(o, ','(o, o))))). game_win_o(','(','(o, ','(X67, X68)), ','(','(o, ','(X69, X70)), ','(o, ','(X71, X72))))). game_win_o(','(','(X73, ','(o, X74)), ','(','(X75, ','(o, X76)), ','(X77, ','(o, X78))))). game_win_o(','(','(X79, ','(X80, o)), ','(','(X81, ','(X82, o)), ','(X83, ','(X84, o))))). game_win_o(','(','(o, ','(X85, X86)), ','(','(X87, ','(o, X88)), ','(X89, ','(X90, o))))). game_win_o(','(','(X91, ','(X92, o)), ','(','(X93, ','(o, X94)), ','(o, ','(X95, X96))))). move(','(','(' ', ','(X97, X98)), ','(','(X99, ','(X100, X101)), ','(X102, ','(X103, X104)))), -(u, l)). move(','(','(X105, ','(' ', X106)), ','(','(X107, ','(X108, X109)), ','(X110, ','(X111, X112)))), -(u, c)). move(','(','(X113, ','(X114, ' ')), ','(','(X115, ','(X116, X117)), ','(X118, ','(X119, X120)))), -(u, r)). move(','(','(X121, ','(X122, X123)), ','(','(' ', ','(X124, X125)), ','(X126, ','(X127, X128)))), -(c, l)). move(','(','(X129, ','(X130, X131)), ','(','(X132, ','(' ', X133)), ','(X134, ','(X135, X136)))), -(c, c)). move(','(','(X137, ','(X138, X139)), ','(','(X140, ','(X141, ' ')), ','(X142, ','(X143, X144)))), -(c, r)). move(','(','(X145, ','(X146, X147)), ','(','(X148, ','(X149, X150)), ','(' ', ','(X151, X152)))), -(l, l)). move(','(','(X153, ','(X154, X155)), ','(','(X156, ','(X157, X158)), ','(X159, ','(' ', X160)))), -(l, c)). move(','(','(X161, ','(X162, X163)), ','(','(X164, ','(X165, X166)), ','(X167, ','(X168, ' ')))), -(l, r)). move(-(u, l), computer, Position, Position1) :- ','(=(','(','(X169, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(o, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(u, c), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(X170, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(o, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(u, r), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, X171)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, o)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, l), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(X172, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(o, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, c), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(X173, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(o, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, r), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, X174)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, o)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(l, l), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(X175, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(o, ','(R3C2, R3C3)))))). move(-(l, c), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(X176, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(o, R3C3)))))). move(-(l, r), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, X177)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, o)))))). move(-(u, l), Player, Position, Position1) :- ','(=(','(','(X178, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(x, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(u, c), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(X179, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(x, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(u, r), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, X180)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, x)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, l), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(X181, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(x, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, c), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(X182, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(x, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, r), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, X183)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, x)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(l, l), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(X184, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(x, ','(R3C2, R3C3)))))). move(-(l, c), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(X185, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(x, R3C3)))))). move(-(l, r), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, X186)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, x)))))). isPlus(zero, X, X). isPlus(succ(X), zero, succ(X)). isPlus(succ(X), succ(Y), succ(succ(Z))) :- isPlus(X, Y, Z). isPlus(succ(X), pred(Y), Z) :- isPlus(X, Y, Z). isPlus(pred(X), zero, pred(X)). isPlus(pred(X), succ(Y), Z) :- isPlus(X, Y, Z). isPlus(pred(X), pred(Y), pred(pred(Z))) :- isPlus(X, Y, Z). isMinus(X, zero, X). isMinus(zero, succ(Y), pred(Z)) :- isMinus(zero, Y, Z). isMinus(zero, pred(Y), succ(Z)) :- isMinus(zero, Y, Z). isMinus(succ(X), succ(Y), Z) :- isMinus(X, Y, Z). isMinus(succ(X), pred(Y), succ(succ(Z))) :- isMinus(X, Y, Z). isMinus(pred(X), succ(Y), pred(pred(Z))) :- isMinus(X, Y, Z). isMinus(pred(X), pred(Y), Z) :- isMinus(X, Y, Z). isTimes(X, zero, zero). isTimes(zero, succ(Y), zero). isTimes(zero, pred(Y), zero). isTimes(succ(X), succ(Y), Z) :- ','(isTimes(succ(X), Y, A), isPlus(A, succ(X), Z)). isTimes(succ(X), pred(Y), Z) :- ','(isTimes(succ(X), Y, A), isMinus(A, succ(X), Z)). isTimes(pred(X), succ(Y), Z) :- ','(isTimes(pred(X), Y, A), isPlus(A, pred(X), Z)). isTimes(pred(X), pred(Y), Z) :- ','(isTimes(pred(X), Y, A), isMinus(A, pred(X), Z)). isDiv(zero, succ(Y), zero). isDiv(zero, pred(Y), zero). isDiv(succ(X), succ(Y), zero) :- isMinus(succ(X), succ(Y), pred(Z)). isDiv(succ(X), succ(Y), succ(Z)) :- ','(isMinus(succ(X), succ(Y), A), isDiv(A, succ(Y), Z)). isDiv(succ(X), pred(Y), Z) :- ','(isMinus(zero, pred(Y), A), ','(isDiv(succ(X), A, B), isMinus(zero, B, Z))). isDiv(pred(X), pred(Y), zero) :- isMinus(pred(X), pred(Y), succ(Z)). isDiv(pred(X), pred(Y), succ(Z)) :- ','(isMinus(pred(X), pred(Y), A), isDiv(A, pred(Y), Z)). isDiv(pred(X), succ(Y), Z) :- ','(isMinus(zero, pred(X), A), ','(isDiv(A, succ(Y), B), isMinus(zero, B, Z))). isModulo(X, Y, Z) :- ','(isDiv(X, Y, A), ','(isTimes(A, Y, B), isMinus(X, B, Z))). isGreater(succ(X), zero). isGreater(succ(X), pred(Y)). isGreater(succ(X), succ(Y)) :- isGreater(X, Y). isGreater(zero, pred(Y)). isGreater(pred(X), pred(Y)) :- isGreater(X, Y). isLess(pred(X), zero). isLess(pred(X), succ(Y)). isLess(pred(X), pred(Y)) :- isLess(X, Y). isLess(zero, succ(Y)). isLess(succ(X), succ(Y)) :- isLess(X, Y). not(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3) :- ','(call1(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3), fail). not(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3). not1(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3) :- ','(call2(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3), fail). not1(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3). call1(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3) :- game_win_x(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3))))). call2(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3) :- game_win_o(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3))))). fail :- failure(a). failure(b). =(X, X). Directives: :- entry(play(Game), .(ground(Game), [])). :- trust(player(Player), [], .(ground(Player), [])). :- trust(abolish0(Player), [], .(ground(Player), [])). Query: play(g,g,a) ---------------------------------------- (25) OrTransformerProof (EQUIVALENT) Transformed all or-constructs[PROLOG]. ---------------------------------------- (26) Obligation: Clauses: play(Game) :- ','(initialize(Game, Position, Player), ','(display_game(Position), play(Position, Player, Result))). play(Position, Player, Result) :- ','(game_over(Position, Player, Result), ','(write(Result), abolish0(player))). play(Position, Player, Result) :- ','(choose(Position, Player, Move), ','(move(Move, Player, Position, Position1), ','(display_game(Position1), ','(next_player(Player, Player1), play(Position1, Player1, Result))))). choose(Position, computer, Move) :- ','(write('Computer is thinking...'), ','(nl, alpha_beta(computer, Position, pred(zero), succ(zero), Move, Value))). choose(Position, Player, Move) :- ','(write(Player), ','(write(', enter move (followed by a period and return) --> '), ','(read(Move1), legal(Position, Player, Move1, Move)))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(==(Player, computer), ','(game_win_o(Position), =(Value, succ(zero)))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(player(Player), ','(game_win_x(Position), =(Value, succ(zero)))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(game_tie(Position), =(Value, zero)). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(==(Player, computer), ','(game_win_x(Position), =(Value, pred(zero)))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(player(Player), ','(game_win_o(Position), =(Value, pred(zero)))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(setof(Move1, move(Position, Move1), Moves), ','(isMinus(zero1, Beta, U), ','(=(Alpha1, U), ','(isMinus(zero1, Alpha, U), ','(=(Beta1, U), evaluate(Player, Moves, Position, Alpha1, Beta1, nil, ','(Move, Value))))))). evaluate(Player, .(Move, Moves), Position, Alpha, Beta, Move1, Best) :- ','(move(Move, Player, Position, Position1), ','(next_player(Player, Player1), ','(alpha_beta(Player1, Position1, Alpha, Beta, MoveX, Value), ','(isMinus(zero1, Value, U), ','(=(Value1, U), cutoff(Player, Move, Value1, Alpha, Beta, Moves, Position, Move1, Best)))))). evaluate(Player, [], Position, Alpha, Beta, Move, ','(Move, Alpha)). cutoff(Player, Move, Value, Alpha, Beta, Moves, Position, Move1, ','(Move, Value)) :- ','(=(X, Value), ','(=(X1, Beta), isGreater(X, X1))). cutoff(Player, Move, Value, Alpha, Beta, Moves, Position, Move1, ','(Move, Value)) :- ','(=(X, Value), ','(=(X1, Beta), =(X, X1))). cutoff(Player, Move, Value, Alpha, Beta, Moves, Position, Move1, Best) :- ','(=(X, Alpha), ','(=(X1, Value), ','(isLess(X, X1), ','(=(X2, Value), ','(=(X3, Beta), ','(isLess(X2, X3), evaluate(Player, Moves, Position, Value, Beta, Move, Best))))))). cutoff(Player, Move, Value, Alpha, Beta, Moves, Position, Move1, Best) :- ','(=(X, Value), ','(=(X1, Alpha), ','(=(X, X1), evaluate(Player, Moves, Position, Alpha, Beta, Move1, Best)))). cutoff(Player, Move, Value, Alpha, Beta, Moves, Position, Move1, Best) :- ','(=(X, Value), ','(=(X1, Alpha), ','(isLess(X, X1), evaluate(Player, Moves, Position, Alpha, Beta, Move1, Best)))). initialize(tictactoe, ','(','(' ', ','(' ', ' ')), ','(','(' ', ','(' ', ' ')), ','(' ', ','(' ', ' ')))), Player) :- ','(write('Enter player`s name (followed by a period and return) --> '), ','(read(Player), ','(write(Player), ','(write(', you will go first and use the symbol "x".'), ','(nl, assert(player(Player))))))). display_game(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3))))) :- ','(nl, ','(write(' '), ','(write(R1C1), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R1C2), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R1C3), ','(write(' '), ','(tab(succ(succ(succ(zero)))), ','(write('u-l = upper left, u-c = upper center, u-r = upper right'), ','(nl, ','(write(' --+---+-- '), ','(nl, ','(write(' '), ','(write(R2C1), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R2C2), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R2C3), ','(write(' '), ','(tab(succ(succ(succ(zero)))), ','(write('c-l = center left, c-c = center center, c-r = center right'), ','(nl, ','(write(' --+---+-- '), ','(nl, ','(write(' '), ','(write(R3C1), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R3C2), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R3C3), ','(write(' '), ','(tab(succ(succ(succ(zero)))), ','(write('l-l = lower left, l-c = lower center, l-r = lower right'), ','(nl, nl))))))))))))))))))))))))))))))))))))))))))))))). next_player(Player, computer) :- player(Player). next_player(computer, Player1) :- player(Player1). legal(Position, Player, Move, Move) :- move(Position, Move). legal(Position, Player, Move1, Move) :- ','(write('Illegal move! '), choose(Position, Player, Move)). game_over(Position, Player, ','(Player1, ' you win!')) :- ','(game_win_x(Position), player(Player1)). game_over(Position, Player, 'Computer wins!') :- game_win_o(Position). game_over(Position, Player, 'It is a tie!') :- game_tie(Position). game_tie(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3))))) :- ','(not(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3), ','(not1(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3), ','(\==(R1C1, ' '), ','(\==(R1C2, ' '), ','(\==(R1C3, ' '), ','(\==(R2C1, ' '), ','(\==(R2C2, ' '), ','(\==(R2C3, ' '), ','(\==(R3C1, ' '), ','(\==(R3C2, ' '), \==(R3C3, ' '))))))))))). game_win_x(','(','(x, ','(x, x)), ','(','(X1, ','(X2, X3)), ','(X4, ','(X5, X6))))). game_win_x(','(','(X7, ','(X8, X9)), ','(','(x, ','(x, x)), ','(X10, ','(X11, X12))))). game_win_x(','(','(X13, ','(X14, X15)), ','(','(X16, ','(X17, X18)), ','(x, ','(x, x))))). game_win_x(','(','(x, ','(X19, X20)), ','(','(x, ','(X21, X22)), ','(x, ','(X23, X24))))). game_win_x(','(','(X25, ','(x, X26)), ','(','(X27, ','(x, X28)), ','(X29, ','(x, X30))))). game_win_x(','(','(X31, ','(X32, x)), ','(','(X33, ','(X34, x)), ','(X35, ','(X36, x))))). game_win_x(','(','(x, ','(X37, X38)), ','(','(X39, ','(x, X40)), ','(X41, ','(X42, x))))). game_win_x(','(','(X43, ','(X44, x)), ','(','(X45, ','(x, X46)), ','(x, ','(X47, X48))))). game_win_o(','(','(o, ','(o, o)), ','(','(X49, ','(X50, X51)), ','(X52, ','(X53, X54))))). game_win_o(','(','(X55, ','(X56, X57)), ','(','(o, ','(o, o)), ','(X58, ','(X59, X60))))). game_win_o(','(','(X61, ','(X62, X63)), ','(','(X64, ','(X65, X66)), ','(o, ','(o, o))))). game_win_o(','(','(o, ','(X67, X68)), ','(','(o, ','(X69, X70)), ','(o, ','(X71, X72))))). game_win_o(','(','(X73, ','(o, X74)), ','(','(X75, ','(o, X76)), ','(X77, ','(o, X78))))). game_win_o(','(','(X79, ','(X80, o)), ','(','(X81, ','(X82, o)), ','(X83, ','(X84, o))))). game_win_o(','(','(o, ','(X85, X86)), ','(','(X87, ','(o, X88)), ','(X89, ','(X90, o))))). game_win_o(','(','(X91, ','(X92, o)), ','(','(X93, ','(o, X94)), ','(o, ','(X95, X96))))). move(','(','(' ', ','(X97, X98)), ','(','(X99, ','(X100, X101)), ','(X102, ','(X103, X104)))), -(u, l)). move(','(','(X105, ','(' ', X106)), ','(','(X107, ','(X108, X109)), ','(X110, ','(X111, X112)))), -(u, c)). move(','(','(X113, ','(X114, ' ')), ','(','(X115, ','(X116, X117)), ','(X118, ','(X119, X120)))), -(u, r)). move(','(','(X121, ','(X122, X123)), ','(','(' ', ','(X124, X125)), ','(X126, ','(X127, X128)))), -(c, l)). move(','(','(X129, ','(X130, X131)), ','(','(X132, ','(' ', X133)), ','(X134, ','(X135, X136)))), -(c, c)). move(','(','(X137, ','(X138, X139)), ','(','(X140, ','(X141, ' ')), ','(X142, ','(X143, X144)))), -(c, r)). move(','(','(X145, ','(X146, X147)), ','(','(X148, ','(X149, X150)), ','(' ', ','(X151, X152)))), -(l, l)). move(','(','(X153, ','(X154, X155)), ','(','(X156, ','(X157, X158)), ','(X159, ','(' ', X160)))), -(l, c)). move(','(','(X161, ','(X162, X163)), ','(','(X164, ','(X165, X166)), ','(X167, ','(X168, ' ')))), -(l, r)). move(-(u, l), computer, Position, Position1) :- ','(=(','(','(X169, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(o, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(u, c), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(X170, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(o, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(u, r), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, X171)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, o)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, l), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(X172, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(o, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, c), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(X173, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(o, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, r), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, X174)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, o)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(l, l), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(X175, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(o, ','(R3C2, R3C3)))))). move(-(l, c), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(X176, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(o, R3C3)))))). move(-(l, r), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, X177)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, o)))))). move(-(u, l), Player, Position, Position1) :- ','(=(','(','(X178, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(x, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(u, c), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(X179, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(x, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(u, r), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, X180)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, x)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, l), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(X181, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(x, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, c), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(X182, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(x, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, r), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, X183)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, x)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(l, l), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(X184, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(x, ','(R3C2, R3C3)))))). move(-(l, c), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(X185, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(x, R3C3)))))). move(-(l, r), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, X186)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, x)))))). isPlus(zero, X, X). isPlus(succ(X), zero, succ(X)). isPlus(succ(X), succ(Y), succ(succ(Z))) :- isPlus(X, Y, Z). isPlus(succ(X), pred(Y), Z) :- isPlus(X, Y, Z). isPlus(pred(X), zero, pred(X)). isPlus(pred(X), succ(Y), Z) :- isPlus(X, Y, Z). isPlus(pred(X), pred(Y), pred(pred(Z))) :- isPlus(X, Y, Z). isMinus(X, zero, X). isMinus(zero, succ(Y), pred(Z)) :- isMinus(zero, Y, Z). isMinus(zero, pred(Y), succ(Z)) :- isMinus(zero, Y, Z). isMinus(succ(X), succ(Y), Z) :- isMinus(X, Y, Z). isMinus(succ(X), pred(Y), succ(succ(Z))) :- isMinus(X, Y, Z). isMinus(pred(X), succ(Y), pred(pred(Z))) :- isMinus(X, Y, Z). isMinus(pred(X), pred(Y), Z) :- isMinus(X, Y, Z). isTimes(X, zero, zero). isTimes(zero, succ(Y), zero). isTimes(zero, pred(Y), zero). isTimes(succ(X), succ(Y), Z) :- ','(isTimes(succ(X), Y, A), isPlus(A, succ(X), Z)). isTimes(succ(X), pred(Y), Z) :- ','(isTimes(succ(X), Y, A), isMinus(A, succ(X), Z)). isTimes(pred(X), succ(Y), Z) :- ','(isTimes(pred(X), Y, A), isPlus(A, pred(X), Z)). isTimes(pred(X), pred(Y), Z) :- ','(isTimes(pred(X), Y, A), isMinus(A, pred(X), Z)). isDiv(zero, succ(Y), zero). isDiv(zero, pred(Y), zero). isDiv(succ(X), succ(Y), zero) :- isMinus(succ(X), succ(Y), pred(Z)). isDiv(succ(X), succ(Y), succ(Z)) :- ','(isMinus(succ(X), succ(Y), A), isDiv(A, succ(Y), Z)). isDiv(succ(X), pred(Y), Z) :- ','(isMinus(zero, pred(Y), A), ','(isDiv(succ(X), A, B), isMinus(zero, B, Z))). isDiv(pred(X), pred(Y), zero) :- isMinus(pred(X), pred(Y), succ(Z)). isDiv(pred(X), pred(Y), succ(Z)) :- ','(isMinus(pred(X), pred(Y), A), isDiv(A, pred(Y), Z)). isDiv(pred(X), succ(Y), Z) :- ','(isMinus(zero, pred(X), A), ','(isDiv(A, succ(Y), B), isMinus(zero, B, Z))). isModulo(X, Y, Z) :- ','(isDiv(X, Y, A), ','(isTimes(A, Y, B), isMinus(X, B, Z))). isGreater(succ(X), zero). isGreater(succ(X), pred(Y)). isGreater(succ(X), succ(Y)) :- isGreater(X, Y). isGreater(zero, pred(Y)). isGreater(pred(X), pred(Y)) :- isGreater(X, Y). isLess(pred(X), zero). isLess(pred(X), succ(Y)). isLess(pred(X), pred(Y)) :- isLess(X, Y). isLess(zero, succ(Y)). isLess(succ(X), succ(Y)) :- isLess(X, Y). not(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3) :- ','(call1(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3), fail). not(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3). not1(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3) :- ','(call2(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3), fail). not1(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3). call1(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3) :- game_win_x(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3))))). call2(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3) :- game_win_o(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3))))). fail :- failure(a). failure(b). =(X, X). Directives: :- entry(play(Game), .(ground(Game), [])). :- trust(player(Player), [], .(ground(Player), [])). :- trust(abolish0(Player), [], .(ground(Player), [])). Query: play(g,g,a) ---------------------------------------- (27) UndefinedPredicateHandlerProof (SOUND) Added facts for all undefined predicates [PROLOG]. ---------------------------------------- (28) Obligation: Clauses: play(Game) :- ','(initialize(Game, Position, Player), ','(display_game(Position), play(Position, Player, Result))). play(Position, Player, Result) :- ','(game_over(Position, Player, Result), ','(write(Result), abolish0(player))). play(Position, Player, Result) :- ','(choose(Position, Player, Move), ','(move(Move, Player, Position, Position1), ','(display_game(Position1), ','(next_player(Player, Player1), play(Position1, Player1, Result))))). choose(Position, computer, Move) :- ','(write('Computer is thinking...'), ','(nl, alpha_beta(computer, Position, pred(zero), succ(zero), Move, Value))). choose(Position, Player, Move) :- ','(write(Player), ','(write(', enter move (followed by a period and return) --> '), ','(read(Move1), legal(Position, Player, Move1, Move)))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(==(Player, computer), ','(game_win_o(Position), =(Value, succ(zero)))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(player(Player), ','(game_win_x(Position), =(Value, succ(zero)))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(game_tie(Position), =(Value, zero)). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(==(Player, computer), ','(game_win_x(Position), =(Value, pred(zero)))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(player(Player), ','(game_win_o(Position), =(Value, pred(zero)))). alpha_beta(Player, Position, Alpha, Beta, Move, Value) :- ','(setof(Move1, move(Position, Move1), Moves), ','(isMinus(zero1, Beta, U), ','(=(Alpha1, U), ','(isMinus(zero1, Alpha, U), ','(=(Beta1, U), evaluate(Player, Moves, Position, Alpha1, Beta1, nil, ','(Move, Value))))))). evaluate(Player, .(Move, Moves), Position, Alpha, Beta, Move1, Best) :- ','(move(Move, Player, Position, Position1), ','(next_player(Player, Player1), ','(alpha_beta(Player1, Position1, Alpha, Beta, MoveX, Value), ','(isMinus(zero1, Value, U), ','(=(Value1, U), cutoff(Player, Move, Value1, Alpha, Beta, Moves, Position, Move1, Best)))))). evaluate(Player, [], Position, Alpha, Beta, Move, ','(Move, Alpha)). cutoff(Player, Move, Value, Alpha, Beta, Moves, Position, Move1, ','(Move, Value)) :- ','(=(X, Value), ','(=(X1, Beta), isGreater(X, X1))). cutoff(Player, Move, Value, Alpha, Beta, Moves, Position, Move1, ','(Move, Value)) :- ','(=(X, Value), ','(=(X1, Beta), =(X, X1))). cutoff(Player, Move, Value, Alpha, Beta, Moves, Position, Move1, Best) :- ','(=(X, Alpha), ','(=(X1, Value), ','(isLess(X, X1), ','(=(X2, Value), ','(=(X3, Beta), ','(isLess(X2, X3), evaluate(Player, Moves, Position, Value, Beta, Move, Best))))))). cutoff(Player, Move, Value, Alpha, Beta, Moves, Position, Move1, Best) :- ','(=(X, Value), ','(=(X1, Alpha), ','(=(X, X1), evaluate(Player, Moves, Position, Alpha, Beta, Move1, Best)))). cutoff(Player, Move, Value, Alpha, Beta, Moves, Position, Move1, Best) :- ','(=(X, Value), ','(=(X1, Alpha), ','(isLess(X, X1), evaluate(Player, Moves, Position, Alpha, Beta, Move1, Best)))). initialize(tictactoe, ','(','(' ', ','(' ', ' ')), ','(','(' ', ','(' ', ' ')), ','(' ', ','(' ', ' ')))), Player) :- ','(write('Enter player`s name (followed by a period and return) --> '), ','(read(Player), ','(write(Player), ','(write(', you will go first and use the symbol "x".'), ','(nl, assert(player(Player))))))). display_game(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3))))) :- ','(nl, ','(write(' '), ','(write(R1C1), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R1C2), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R1C3), ','(write(' '), ','(tab(succ(succ(succ(zero)))), ','(write('u-l = upper left, u-c = upper center, u-r = upper right'), ','(nl, ','(write(' --+---+-- '), ','(nl, ','(write(' '), ','(write(R2C1), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R2C2), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R2C3), ','(write(' '), ','(tab(succ(succ(succ(zero)))), ','(write('c-l = center left, c-c = center center, c-r = center right'), ','(nl, ','(write(' --+---+-- '), ','(nl, ','(write(' '), ','(write(R3C1), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R3C2), ','(write(' '), ','(write('|'), ','(write(' '), ','(write(R3C3), ','(write(' '), ','(tab(succ(succ(succ(zero)))), ','(write('l-l = lower left, l-c = lower center, l-r = lower right'), ','(nl, nl))))))))))))))))))))))))))))))))))))))))))))))). next_player(Player, computer) :- player(Player). next_player(computer, Player1) :- player(Player1). legal(Position, Player, Move, Move) :- move(Position, Move). legal(Position, Player, Move1, Move) :- ','(write('Illegal move! '), choose(Position, Player, Move)). game_over(Position, Player, ','(Player1, ' you win!')) :- ','(game_win_x(Position), player(Player1)). game_over(Position, Player, 'Computer wins!') :- game_win_o(Position). game_over(Position, Player, 'It is a tie!') :- game_tie(Position). game_tie(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3))))) :- ','(not(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3), ','(not1(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3), ','(\==(R1C1, ' '), ','(\==(R1C2, ' '), ','(\==(R1C3, ' '), ','(\==(R2C1, ' '), ','(\==(R2C2, ' '), ','(\==(R2C3, ' '), ','(\==(R3C1, ' '), ','(\==(R3C2, ' '), \==(R3C3, ' '))))))))))). game_win_x(','(','(x, ','(x, x)), ','(','(X1, ','(X2, X3)), ','(X4, ','(X5, X6))))). game_win_x(','(','(X7, ','(X8, X9)), ','(','(x, ','(x, x)), ','(X10, ','(X11, X12))))). game_win_x(','(','(X13, ','(X14, X15)), ','(','(X16, ','(X17, X18)), ','(x, ','(x, x))))). game_win_x(','(','(x, ','(X19, X20)), ','(','(x, ','(X21, X22)), ','(x, ','(X23, X24))))). game_win_x(','(','(X25, ','(x, X26)), ','(','(X27, ','(x, X28)), ','(X29, ','(x, X30))))). game_win_x(','(','(X31, ','(X32, x)), ','(','(X33, ','(X34, x)), ','(X35, ','(X36, x))))). game_win_x(','(','(x, ','(X37, X38)), ','(','(X39, ','(x, X40)), ','(X41, ','(X42, x))))). game_win_x(','(','(X43, ','(X44, x)), ','(','(X45, ','(x, X46)), ','(x, ','(X47, X48))))). game_win_o(','(','(o, ','(o, o)), ','(','(X49, ','(X50, X51)), ','(X52, ','(X53, X54))))). game_win_o(','(','(X55, ','(X56, X57)), ','(','(o, ','(o, o)), ','(X58, ','(X59, X60))))). game_win_o(','(','(X61, ','(X62, X63)), ','(','(X64, ','(X65, X66)), ','(o, ','(o, o))))). game_win_o(','(','(o, ','(X67, X68)), ','(','(o, ','(X69, X70)), ','(o, ','(X71, X72))))). game_win_o(','(','(X73, ','(o, X74)), ','(','(X75, ','(o, X76)), ','(X77, ','(o, X78))))). game_win_o(','(','(X79, ','(X80, o)), ','(','(X81, ','(X82, o)), ','(X83, ','(X84, o))))). game_win_o(','(','(o, ','(X85, X86)), ','(','(X87, ','(o, X88)), ','(X89, ','(X90, o))))). game_win_o(','(','(X91, ','(X92, o)), ','(','(X93, ','(o, X94)), ','(o, ','(X95, X96))))). move(','(','(' ', ','(X97, X98)), ','(','(X99, ','(X100, X101)), ','(X102, ','(X103, X104)))), -(u, l)). move(','(','(X105, ','(' ', X106)), ','(','(X107, ','(X108, X109)), ','(X110, ','(X111, X112)))), -(u, c)). move(','(','(X113, ','(X114, ' ')), ','(','(X115, ','(X116, X117)), ','(X118, ','(X119, X120)))), -(u, r)). move(','(','(X121, ','(X122, X123)), ','(','(' ', ','(X124, X125)), ','(X126, ','(X127, X128)))), -(c, l)). move(','(','(X129, ','(X130, X131)), ','(','(X132, ','(' ', X133)), ','(X134, ','(X135, X136)))), -(c, c)). move(','(','(X137, ','(X138, X139)), ','(','(X140, ','(X141, ' ')), ','(X142, ','(X143, X144)))), -(c, r)). move(','(','(X145, ','(X146, X147)), ','(','(X148, ','(X149, X150)), ','(' ', ','(X151, X152)))), -(l, l)). move(','(','(X153, ','(X154, X155)), ','(','(X156, ','(X157, X158)), ','(X159, ','(' ', X160)))), -(l, c)). move(','(','(X161, ','(X162, X163)), ','(','(X164, ','(X165, X166)), ','(X167, ','(X168, ' ')))), -(l, r)). move(-(u, l), computer, Position, Position1) :- ','(=(','(','(X169, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(o, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(u, c), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(X170, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(o, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(u, r), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, X171)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, o)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, l), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(X172, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(o, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, c), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(X173, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(o, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, r), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, X174)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, o)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(l, l), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(X175, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(o, ','(R3C2, R3C3)))))). move(-(l, c), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(X176, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(o, R3C3)))))). move(-(l, r), computer, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, X177)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, o)))))). move(-(u, l), Player, Position, Position1) :- ','(=(','(','(X178, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(x, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(u, c), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(X179, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(x, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(u, r), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, X180)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, x)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, l), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(X181, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(x, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, c), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(X182, R2C3)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(x, R2C3)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(c, r), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, X183)), ','(R3C1, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, x)), ','(R3C1, ','(R3C2, R3C3)))))). move(-(l, l), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(X184, ','(R3C2, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(x, ','(R3C2, R3C3)))))). move(-(l, c), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(X185, R3C3)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(x, R3C3)))))). move(-(l, r), Player, Position, Position1) :- ','(=(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, X186)))), Position), =(Position1, ','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, x)))))). isPlus(zero, X, X). isPlus(succ(X), zero, succ(X)). isPlus(succ(X), succ(Y), succ(succ(Z))) :- isPlus(X, Y, Z). isPlus(succ(X), pred(Y), Z) :- isPlus(X, Y, Z). isPlus(pred(X), zero, pred(X)). isPlus(pred(X), succ(Y), Z) :- isPlus(X, Y, Z). isPlus(pred(X), pred(Y), pred(pred(Z))) :- isPlus(X, Y, Z). isMinus(X, zero, X). isMinus(zero, succ(Y), pred(Z)) :- isMinus(zero, Y, Z). isMinus(zero, pred(Y), succ(Z)) :- isMinus(zero, Y, Z). isMinus(succ(X), succ(Y), Z) :- isMinus(X, Y, Z). isMinus(succ(X), pred(Y), succ(succ(Z))) :- isMinus(X, Y, Z). isMinus(pred(X), succ(Y), pred(pred(Z))) :- isMinus(X, Y, Z). isMinus(pred(X), pred(Y), Z) :- isMinus(X, Y, Z). isTimes(X, zero, zero). isTimes(zero, succ(Y), zero). isTimes(zero, pred(Y), zero). isTimes(succ(X), succ(Y), Z) :- ','(isTimes(succ(X), Y, A), isPlus(A, succ(X), Z)). isTimes(succ(X), pred(Y), Z) :- ','(isTimes(succ(X), Y, A), isMinus(A, succ(X), Z)). isTimes(pred(X), succ(Y), Z) :- ','(isTimes(pred(X), Y, A), isPlus(A, pred(X), Z)). isTimes(pred(X), pred(Y), Z) :- ','(isTimes(pred(X), Y, A), isMinus(A, pred(X), Z)). isDiv(zero, succ(Y), zero). isDiv(zero, pred(Y), zero). isDiv(succ(X), succ(Y), zero) :- isMinus(succ(X), succ(Y), pred(Z)). isDiv(succ(X), succ(Y), succ(Z)) :- ','(isMinus(succ(X), succ(Y), A), isDiv(A, succ(Y), Z)). isDiv(succ(X), pred(Y), Z) :- ','(isMinus(zero, pred(Y), A), ','(isDiv(succ(X), A, B), isMinus(zero, B, Z))). isDiv(pred(X), pred(Y), zero) :- isMinus(pred(X), pred(Y), succ(Z)). isDiv(pred(X), pred(Y), succ(Z)) :- ','(isMinus(pred(X), pred(Y), A), isDiv(A, pred(Y), Z)). isDiv(pred(X), succ(Y), Z) :- ','(isMinus(zero, pred(X), A), ','(isDiv(A, succ(Y), B), isMinus(zero, B, Z))). isModulo(X, Y, Z) :- ','(isDiv(X, Y, A), ','(isTimes(A, Y, B), isMinus(X, B, Z))). isGreater(succ(X), zero). isGreater(succ(X), pred(Y)). isGreater(succ(X), succ(Y)) :- isGreater(X, Y). isGreater(zero, pred(Y)). isGreater(pred(X), pred(Y)) :- isGreater(X, Y). isLess(pred(X), zero). isLess(pred(X), succ(Y)). isLess(pred(X), pred(Y)) :- isLess(X, Y). isLess(zero, succ(Y)). isLess(succ(X), succ(Y)) :- isLess(X, Y). not(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3) :- ','(call1(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3), fail). not(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3). not1(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3) :- ','(call2(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3), fail). not1(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3). call1(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3) :- game_win_x(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3))))). call2(R1C1, R1C2, R1C3, R2C1, R2C2, R2C3, R3C1, R3C2, R3C3) :- game_win_o(','(','(R1C1, ','(R1C2, R1C3)), ','(','(R2C1, ','(R2C2, R2C3)), ','(R3C1, ','(R3C2, R3C3))))). fail :- failure(a). failure(b). =(X, X). write(X0). abolish0(X0). nl. read(X0). ==(X0, X1). player(X0). setof(X0, X1, X2). assert(X0). tab(X0). \==(X0, X1). Directives: :- entry(play(Game), .(ground(Game), [])). :- trust(player(Player), [], .(ground(Player), [])). :- trust(abolish0(Player), [], .(ground(Player), [])). Query: play(g,g,a)