это кажется довольно простым делом ...
h(state(A,B,C,D,E,F,G,H,I),Z) :-
count_matching([A,B,C,D,E,F,G,H,I], [1,2,3,8,0,4,7,6,5], 0, Z).
count_matching([], [], N, N).
count_matching([A|As], [B|Bs], N, M) :-
( A == B
-> T is N + 1
; T is N
),
count_matching(As, Bs, T, M).
Библиотека агрегатов SWI-Prolog предлагает еще один простой способ решения вашей проблемы:
:- [library(aggregate)].
h(state(A,B,C,D,E,F,G,H,I),Z) :-
aggregate_all(count,
(nth1(Index, [1,2,3,8,0,4,7,6,5], Cell),
nth1(Index, [A,B,C,D,E,F,G,H,I], Cell)), Z).
Использование aggregate_all излишне: здесьболее простая программа, использующая ту же схему (недетерминированный доступ к элементам через nth / 3):
h(state(A,B,C,D,E,F,G,H,I),Z) :-
findall(_,
(nth1(Index, [1,2,3,8,0,4,7,6,5], Cell),
nth1(Index, [A,B,C,D,E,F,G,H,I], Cell)), L),
length(L, Z).