Using an adaptation of the algorithm here, I get
a shorter solution with only 37 game positions:
?- init(X), best(X, x, L, W),
findall(Z, inside(L, Z), A),
sort(A, B), length(B, N).
B = [[[-, -, -], [-, x, -], [-, -, -]], [[x, -, o],
[-, x, -], [-, -, -]], [[x, -, o], [-, x, x], [-, -, o]],
[[x, o, -], [-, x, -], [-, -, -]], [[x, o, -], [-, x, -],
[-, o, x]], [[x, o, -], [-, x, -], [x, -, o]], [[x, o, -],
[-, x, o], [-, -, x]], [[x, o, -], [-, x, x], [o, -, -]],
[[x, o, -], [o, x, -], [-, -, x]], [[x, o, o], [-, x, -],
[-, -, x]], [[x, o, o], [-, x, -], [x, -, -]], [[x, o, o],
[-, x, o], [x, -, x]], [[x, o, o], [-, x, x], [-, -, -]],
[[x, o, o], [-, x, x], [o, x, -]], [[x, o, o], [-, x, x],
[x, o, -]], [[x, o, x], [-, x, -], [o, x, o]], [[x, o, x],
[-, x, -], [x, o, o]], [[x, o, x], [o, x, -], [o, -, x]],
[[x, o, x], [o, x, -], [x, -, o]], [[x, x, -], [-, x, o],
[o, o, x]], [[x, x, -], [-, x, o], [o, x, o]], [[x, x, -],
[o, x, -], [o, x, o]], [[x, x, -], [o, x, o], [o, -, x]],
[[x, x, o], [-, x, -], [o, -, -]], [[x, x, o], [-, x, -],
[o, o, x]], [[x, x, o], [-, x, -], [o, x, o]], [[x, x, o],
[-, x, o], [-, o, x]], [[x, x, o], [-, x, o], [o, x, -]],
[[x, x, o], [o, x, -], [-, x, o]], [[x, x, o], [o, x, -],
[o, x, -]], [[x, x, o], [o, x, o], [-, x, -]], [[x, x, o],
[o, x, o], [x, o, x]], [[x, x, o], [o, x, x], [o, x, o]],
[[x, x, o], [o, x, x], [x, o, o]], [[x, x, o], [x, x, o],
[o, o, x]], [[x, x, x], [o, x, -], [o, -, o]],
[[x, x, x], [o, x, o], [o, x, o]]],
N = 37
But since best/4 uses random_member/2 to make the choice
deterministic, by rerunning, one gets also longer results.
Prolog code for the tic-tac-toe game
score via findall, return random winning strategy
reduce number of moves through symmetry
https://gist.github.com/jburse/928f060331ed7d5307a0d3fcd6d4aae9#file-tictac4-pl