#prolog
#пролог
Вопрос:
У меня есть предикат:
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:
Я думаю, что вам нужен этот встроенный предикат.
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