PROLOG - Проверка правильности размещения - PullRequest
3 голосов
/ 05 ноября 2011

У меня есть головоломка, представляющая собой сетку 3 * 3 с числами 1-8, с пустым местом (0), по которому я могу перемещаться. Это конечное состояние головоломки:

1 2 3 
8 0 4 
7 6 5

Все это «состояние» представлено состоянием (1,2,3,8,0,4,7,6,5), читая по горизонтали. Мне нужна функция, чтобы проверить, какие части находятся в нужных местах.

У меня есть:

h(state(A,B,C,D,E,F,G,H,I),Z) :-

Теперь Z будет числом штук в правильном месте.

A = 1
B = 2
C = 3
D = 8
E = 0
F = 4
G = 7
H = 6
I = 5

Есть ли простой способ дать вывод для Z? Любая помощь будет оценена. Спасибо.

Ответы [ 3 ]

2 голосов
/ 05 ноября 2011

Вы уверены, что не можете хранить свою информацию в списках?Это похоже на то, как в традиционном языке вы используете массивы, а не просто набор переменных, если вам нужен способ их перебирать.

1 голос
/ 05 ноября 2011

Существует короткий способ выразить это в Прологе, но для этого требуется CLP (FD) .

:- use_module(library(clpfd)).

h(State, Z) :-
    State =.. [state | Pos],
    maplist(equal, Pos, [0,1,2,3,8,0,4,7,6,5], Eq),
    sum(Eq, #=, Z).

equal(X, Y, E) :-
    E #<==> (X #= Y).
0 голосов
/ 05 ноября 2011

это кажется довольно простым делом ...

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).
...