// --------- Роли игроков --------- role(white) role(black) // --------- Возможные состояния игры --------- base(control(white)) base(control(black)) base(cell(M,x)) :- index(M) base(cell(M,o)) :- index(M) base(cell(M,b)) :- index(M) index(1) index(2) index(3) // --------- Возможные действия игроков --------- input(R, mark(M)) :- role(R) & index(M) input(R, noop) :- role(R) // --------- Начальное состояние --------- init(cell(1,b)) init(cell(2,b)) init(cell(3,b)) init(control(white)) // --------- Допустимые действия игроков в текущем состоянии --------- legal(R,mark(M)) :- true(cell(M,b)) & true(control(R)) legal(white,noop) :- true(control(black)) legal(black,noop) :- true(control(white)) // --------- Переход к следующему состоянию... --------- // ... Изменяем состояние одной ячейки вследствие хода игрока next(cell(M,x)) :- does(white,mark(M)) & true(cell(M,b)) next(cell(M,o)) :- does(black,mark(M)) & true(cell(M,b)) // ... Оставляем остальные ячейки в прежнем состоянии next(cell(M,Z)) :- true(cell(M,Z)) & distinct(W,b) next(cell(M,b)) :- does(R,mark(J)) & true(cell(M,b)) & distinct(M,J) // ... Смена игрока next(control(white)) :- true(control(black)) next(control(black)) :- true(control(white)) // --------- Конечные состояния --------- terminal :- line(Z) terminal :- ~open open :- true(cell(M,b)) line(Z) :- true(cell(1,Z)) & true(cell(2,Z)) line(Z) :- true(cell(2,Z)) & true(cell(3,Z)) // --------- Выигрыши --------- goal(white,100) :- line(x) & ~line(o) goal(white,0) :- ~line(x) & line(o) goal(black,100) :- ~line(x) & line(o) goal(black,0) :- line(x) & ~line(o)