puremate.cql

// Download puremate.cql
// PGN output when run on sample.pgn

/*******
Find positions where black is in pure mate. 

There are numerous mutually incompatible definitions of "pure mate"
published and on the internet. To begin the process of determining the
best definition, we use the following motivation (from British Chess
Magazine, August, 1898), defining a "clean mate" as:
-------
    a mate in in which there is no unnecessary attack by the mating side
    on a square in the mated King's field or the king itself.
------
The key here is that each (a) *attack* must be (b) *necessary*.

The first point is (a): we are looking at *attacks* by the attacking
side. Some authors have suggested in their definitions that it is the
attacking *piece* that must be necessary in some cases, or in one case
the attacking *move*. We disagree: we think it is  more
intuitive to consider actual attacks, rather than the piece causing the
attacks or the move leading to the attack. (By contrast, in model mates
we do consider the necessity of a piece itself).

The second point is (b): the attack must be *necessary*. Many authors allow
any number of attacks on attacking pieces in the king's field. For
example, consider the following position:

White: Kh1 Qh7 Bg6 Rh2 Ng5
Black: kh8

Here, black is in mate from the queen on h7. Each empty square in the
king's field is guarded once.  But the queen on h7 is attacked three
times: by a bishop on g6, by a rook on h2, and by the knight on g5.
Obviously, these attacks are "unnecessary" so the position should not
be pure mate. Calling this pure mate in our view is not consistent
with the early definitions and also not with the spirit of term. It
just doesn't make intuitive sense in our opinion to allow a mate with
so much superfluous attacking force and call that pure.

Despite this, two widely available sources  allow this kind
of mate: the Oxford Companion to Chess (2d) edition ("unoccupied
squares in the king's field are attacked once only") and Wikipedia
("all vacant squares in the king's field are attacked only once", last
visited 10 September 2018, citing the Oxford Companion to Chess). We
doubt very much that the Oxford Companion even intended to exempt
attacking pieces in the king's field from being defended multiple
times by pieces of their own color. 

We therefore take our definition of "pure mate" from the Encyclopedia
of Chess Problems. We believe that in most cases this is a more
authoritative source: for one thing it is exclusively focused on
problem themes. It goes into far more detail and has far more themes
than either Wikipedia or the Oxford Companion. More important, the
Encyclopedia of Chess Problems' definition simply makes more sense to
us:
-----
Mate is called pure when there is only one guard or block on each
square in the (mated) King's field. Double check is allowed if the
mate could be parried without it. A pin-mate is allowed if pinning is
needed in mate.
----
Note the key change of the word "attack" in Oxford Companion and
Wikipedia to the word "guard". This difference is significant in the
cases like the following:

White: Ke6 Ra8 
Black: ke8

Here, the square f8 is not "attacked" at all. Therefore, under the
definition in the Oxford Companion (requiring squares to be attacked
"once only"), this would *not* be pure mate; neither would it be pure
mate under Wikipedia.  Those sources do not allow squares in the king's field
to be attacked 0 times. Again, we are sure this omission is
unintentional, but it is there.

Wikipedia and the Oxford Companion diverge from one another in the case of
double check. Wikipedia does not mention double check. The Oxford
Companion states that in a pure mate, "the mating move is not a double
check unless this is necessary to prevent the defender from
interposing a man or capturing a checking piece."

Under the Oxford definition, there might be two identical positions, one of
which is a pure mate, and one of which is not, depending only on the
previous move (for example, if the previous move captured a piece that
would otherwise have interposed). We again concur with Encyclopedia of
Chess Problems and with the British Chess Magazine that pure mate
should be based on the position itself, not on the move history
leading up to it. Here, even Wikipedia does not quote this definition,
although the Oxford Companion is the only cited reference.

This motivates our treatment of double check, following the Encyclopedia
of Chess Problems:

We preliminarily say that a white piece x *guards* a square y in the
Black King's field (which we define to exclude the king itself) if
either

 (1) x attacks y, or
 (2) x would attack y if the black king were on y

For example, in the position:
  W: Ke6 Ra8
  B: Ke8

The white rook on a8 guards (but does not attack) f8.

The conditions then are:

 1. Every empty square in the King's field is guarded exactly once
 2. Every square with a white piece in the King's field is guarded
 exactly once
 3. Every square with a black piece in the King's field is either
    unguarded or guarded once by a necessary pin

A necessary pin is a pin whose absence would allow the pinned piece
either to affect the mate, either by interposing between a checker and
the king, or by capturing a checker.  Thus, if the king is in double
check, there are no necessary pins.

Finally, double check is allowed only if the double check itself is
necessary, which we interpret to mean that each check could be refuted
if not for the other check, where "refuted" means that its checker
could be captured or prevented by interposition. (Of course, the mate
can never be refuted by moving the black king, because removing just a
check does not change the king's flight squares).  The phrase "if not
for the other check" means that only the attack on the king's square
by that checker is counterfactually eliminated in determining whether
a black piece could interpose.

=======================
Implementation Notes:
======================

        Global Variables:

KingsField is the squares adjacent to the black king.

Checkers is the set of checking pieces

        Functions:
	---------

GuardedSquares(x)
-----------------
 returns the set of squares in the king's field guarded by a piece x

GuardedPieces(s)
----------------
returns the set of pieces guarding a square s  

Necessary(Checker)
------------------
Here the argument Checker is a checking piece in a double check.  The
function is true if that Checker's check is necessary to the mate, in
the sense that removing the attack by Checker on the black king would
allow a (non-pinned) black piece to prevent the remaining check either
by capture or interposition

*****************/

cql(input heijden.pgn)
flipcolor{mate btm

KingsField= . attackedby k

Checkers= A attacks k

function GuardedSquares(x){
  KingsField attackedby x
  | xray (x k KingsField)}

function GuardingPieces(s) { 
  piece fy in A
     s & GuardedSquares(fy)}
     

// Every flight square guarded exactly once
square all FlightSquare in KingsField & [_A]
  GuardingPieces(FlightSquare)==1

//Every selfblocker is either unguarded, or, if it is not double check,
// (a) pinned and (b) could interfere with a checker

square all SelfBlocker in KingsField & a {
  SelfBlockerGuards=GuardingPieces(SelfBlocker)
  if Checkers>1 then
        not SelfBlockerGuards
  else{ //single-check case
     not SelfBlockerGuards
     or
     {SelfBlockerGuards==1
      pin through SelfBlocker
      move pseudolegal
          from SelfBlocker
	  to   (Checkers | between (Checkers k))
      or move pseudolegal enpassant from SelfBlocker	  
     }
   } // end the single-check case
  } //end considering the SelfBlocker

function Necessary(Checker){
  OtherChecker=Checkers & ~Checker
  RefutationSquares= OtherChecker | between (OtherChecker k)
  NonPinnedBlackPiece= {a & ~pin} & ~k
  NonPinnedBlackPiece attacks RefutationSquares
}                       

if(Checkers>1)then
  square all Checker in Checkers
   Necessary(Checker)
}