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

 Two non-king, non-pawn pieces T1 and T2 trace identical non-intersecting
 paths in the same order. The path length must be at least 3.

  From a given position C, local dictionary D holds the each element of the T1 path
  starting at C: D[1] is the first destination square, D[2] the second and so on.
  The 'local' means that the dictionary is run fresh on each game, it is not
  persistent in other words. This lets the code run multithreaded.

  Next, a sort on an echo (source target) is done to find all T2 such
  that, beginning at position target, T2 traverses as many D[1], D[2], D[3],...
  paths as it can. The length of this second path is held in the
  variable PathLength.

  Both traversed paths, T1 and T2 are then output (only the first PathLen
  squares of the T1 path is output).

cql(input hhdbvi.pgn quiet)
local dictionary D
unbind D

  not toSeen
    D[pathcount]=to {3,}

sort "path length"
 echo(source target){
  piece T2= ~T1(from)
  typename T2==typename T1
   T2 title "T2" piecepath
     D[pathcount]==to {3,}

  source:  title "T1" T1 piecepath
     pathcount  PathLen +