0 votes
1 view
in AI and Deep Learning by (28.1k points)

Let me start by saying that this question can be answered by AI wizards with no Prolog experience.

The excellent Prolog Programming for Artificial Intelligence book has this quite terse and clever minimax implementation:

 minimax( Pos, BestSucc, Val)  :-

  moves( Pos, PosList), !,               % Legal moves in Pos produce PosList

  best( PosList, BestSucc, Val)

   ;

   staticval( Pos, Val).                 % Pos has no successors: evaluate statically 

best( [ Pos], Pos, Val)  :-

  minimax( Pos, _, Val), !.

best( [Pos1 | PosList], BestPos, BestVal)  :-

  minimax( Pos1, _, Val1),

  best( PosList, Pos2, Val2),

  betterof( Pos1, Val1, Pos2, Val2, BestPos, BestVal).

betterof( Pos0, Val0, Pos1, Val1, Pos0, Val0)  :- % Pos0 better than Pos1

  min_to_move( Pos0),                                    % MIN to move in Pos0

  Val0 > Val1, !                                         % MAX prefers the greater value

  ;

  max_to_move( Pos0),                                    % MAX to move in Pos0

  Val0 < Val1, !.                                % MIN prefers the lesser value 

better of( Pos0, Val0, Pos1, Val1, Pos1, Val1).           % Otherwise Pos1 better than Pos0

However, the author didn't go to any lengths in describing it and I'm left to wonder what min_to_move/1 and max_to_move/1 are.

Can anyone explain this to me?

Thanks in advance!

1 Answer

0 votes
by (57.5k points)

Clearly, min_to_move(Pos) is true if and only if the "minimizing" player is to make a move in position Pos. Conversely for max_to_move/1. Subjectively, the coding style depicted here as not very good. For example, on many occasions, if-then-else ((->)/2 and (;)/2) seems to be a better fit to express the intention. The predicate names could also be much more descriptive and more appealing.

Welcome to Intellipaat Community. Get your technical queries answered by top developers !


Categories

...