Пролог простой предикат, Как? - PullRequest
4 голосов
/ 04 июня 2011

У меня есть предикат:

neig(I, J, I1, J1):-
    I1 is I - 1,
    I1 >= 0,
    J1 is J.
neig(I, J, I1, J1):-
    I1 is I + 1,
    not(I1 > 8),
    J1 is J.
neig(I, J, I1, J1):-
    J1 is J - 1,
    J1 >= 0,
    I1 is I.
neig(I, J, I1, J1):-
    J1 is J + 1,
    not(J1 > 8),
    I1 is I.

neig(I, J, I1, J1):-
    I1 is I - 1,
    J1 is J - 1,
    I1 >= 0,
    J1 >= 0.
neig(I, J, I1, J1):-
    I1 is I + 1,
    J1 is J + 1,
    not(I1 > 8),
    not(J1 > 8).
neig(I, J, I1, J1):-
    I1 is I + 1,
    J1 is J - 1,
    J1 >= 0,
    not(I1 > 8).
neig(I, J, I1, J1):-
    I1 is I - 1,
    J1 is J + 1,
    I1 >= 0,
    not(J1 > 8).

Как написать предикат all_neighs(I, J, L), где L как список, и он содержит все различные элементы [I1, J1], такие как neigh(I, J, I1, J1)?

1 Ответ

1 голос
/ 04 июня 2011

Я думаю, что вам нужен этот встроенный предикат.

findall(Things,GoalCondition, Bag)

Что бы выглядело примерно так:

all_neighs(I,J,L) :- findall([H|T],neig(I,J,H,T), L).

вам, возможно, придется проверить, является ли T атомом.если это то, что вы хотите.Но с этим мой результат с некоторыми примерами.

1 ?- all_neighs(0,0,X).
X = [[1|0], [0|1], [1|1]].

2 ?- all_neighs(1,1,X).
X = [[0|1], [2|1], [1|0], [1|2], [0|0], [2|2], [2|0], [0|...]].

Вам также следует взглянуть на это: [1] объясняется, как вы можете легко реализовать предикат findall (...) самостоятельно.

[1] http://www.csupomona.edu/~jrfisher/www/prolog_tutorial/2_12.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...