% Illustrative 3-ply game tree modified
% from Ivan Bratko's book

moves(X,Y,N) :-
    findall(X,legal(N,X),Y),
    Y \= [].

legal(N,X) :-
    min(N),
    member(V,X),
    var(V),
    V = o.
legal(N,X) :-
    max(N),
    member(V,X),
    var(V),
    V = x.

min(-1).
max(1).

utility(P,V) :- 
    utility1(P,V), 
    write('utility at node '),writeln(P=V).

utility1([w,_,_,_,_,_,_,_,_],10).
utility1([_,w,_,_,_,_,_,_,_],10).
utility1([_,_,w,_,_,_,_,_,_],10).
utility1([_,_,_,_,_,_,_,_,b],-10).
utility1([_,_,_,_,_,_,_,b,_],-10).
utility1([_,_,_,_,_,_,b,_,_],-10).
utility1([_,_,_,x,x,x,_,_,_],1).
utility1([_,_,_,_,_,_,x,x,x],1).
utility1([x,_,_,x,_,_,x,_,_],1).
utility1([_,x,_,_,x,_,_,x,_],1).
utility1([_,_,x,_,_,x,_,_,x],1).
utility1([x,_,_,_,x,_,_,_,x],1).
utility1([_,_,x,_,x,_,x,_,_],1).
utility1([o,o,o,_,_,_,_,_,_],-1).
utility1([_,_,_,o,o,o,_,_,_],-1).
utility1([_,_,_,_,_,_,o,o,o],-1).
utility1([o,_,_,o,_,_,o,_,_],-1).
utility1([_,o,_,_,o,_,_,o,_],-1).
utility1([_,_,o,_,_,o,_,_,o],-1).
utility1([o,_,_,_,o,_,_,_,o],-1).
utility1([_,_,o,_,o,_,o,_,_],-1).

utility1([A,B,C,D,E,F,G,H,I],0) :-
    ground([A,B,C,D,E,F,G,H,I]).
