/* Tic-tac benchmark in Picat. From http://www.jekejeke.ch/idatab/doclet/prod/en/docs/05_run/15_stdy/06_bench/09_programs/06_tictac/01_tictac.p.html This Picat model was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ import util. % import cp. main => go. /** * Prolog code for the tic-tac-toe game. * * Min-max search via negation. * * Copyright 2011-2012, XLOG Technologies GmbH, Switzerland * Jekejeke Prolog 0.9.1 (a fast and small prolog interpreter) */ % move(+Board,+Player,-Board) move([[-,B,C],[D,E,F],[G,H,I]],P,M2) ?=> M2=[[P,B,C],[D,E,F],[G,H,I]]. move([[A,-,C],[D,E,F],[G,H,I]],P,M2) ?=> M2=[[A,P,C],[D,E,F],[G,H,I]]. move([[A,B,-],[D,E,F],[G,H,I]],P,M2) ?=> M2=[[A,B,P],[D,E,F],[G,H,I]]. move([[A,B,C],[-,E,F],[G,H,I]],P,M2) ?=> M2=[[A,B,C],[P,E,F],[G,H,I]]. move([[A,B,C],[D,-,F],[G,H,I]],P,M2) ?=> M2=[[A,B,C],[D,P,F],[G,H,I]]. move([[A,B,C],[D,E,-],[G,H,I]],P,M2) ?=> M2=[[A,B,C],[D,E,P],[G,H,I]]. move([[A,B,C],[D,E,F],[-,H,I]],P,M2) ?=> M2=[[A,B,C],[D,E,F],[P,H,I]]. move([[A,B,C],[D,E,F],[G,-,I]],P,M2) ?=> M2=[[A,B,C],[D,E,F],[G,P,I]]. move([[A,B,C],[D,E,F],[G,H,-]],P,M2) => M2=[[A,B,C],[D,E,F],[G,H,P]]. % init(+Board) init(B) => B=[[-,-,-],[-,-,-],[-,-,-]]. % win(+Board,+Player) win([[P,P,P],[_,_,_],[_,_,_]],P) => true. win([[_,_,_],[P,P,P],[_,_,_]],P) => true. win([[_,_,_],[_,_,_],[P,P,P]],P) => true. win([[P,_,_],[P,_,_],[P,_,_]],P) => true. win([[_,P,_],[_,P,_],[_,P,_]],P) => true. win([[_,_,P],[_,_,P],[_,_,P]],P) => true. win([[P,_,_],[_,P,_],[_,_,P]],P) => true. win([[_,_,P],[_,P,_],[P,_,_]],P) => true. % other(+Player,-Player). other(o,P2) => P2=x. other(x,P2) => P2=o. % tie(+Board,+Player) tie(X,P) => not move(X,P,_). % best(+Board,+Player,-Board) best(X,P,Y) => move(X,P,Y), (win(Y,P) -> true; other(P,Q), not tie(Y,Q), not best(Y,Q,_)). % Should fail tictac => init(X), best(X,x,_), writeln(X). tictac2 => init(X), best(X,x,_). % go => tictac -> writeln(ok) ; writeln (nope). go => tictac. % go2 => tictac -> write(ok) ; write(nope).