Пролог для синтаксической ошибки цикла

Я пытаюсь сделать игру, похожую на тральщик, и мне нужно проверить соседей квадрата на карте, но я получаю синтаксическую ошибку в моем цикле for, я использую SWI-Prolog

checkneighbours(X,Y) :-
retractall(vecini(_)),
assert(vecini(0)),
foreach(I in X-1..X+1,
            (foreach J in Y-1..Y+1,
                (map(I,J,Z),
                    ( Z=:= "X"
                                -> vecini(V),
                                V1 is V+1,
                                assert(vecini(V1))
                    )
                )
            )
        ).

разве я не объявил петли правильно? или как я могу зациклиться между X-1 и X+1?


person Bogdan    schedule 15.05.2013    source источник
comment
Так какую ошибку вы видите?   -  person    schedule 15.05.2013
comment
Синтаксическая ошибка при первом foreach   -  person Bogdan    schedule 15.05.2013
comment
Просто добавьте точный вывод ошибки в вопрос. И где вы видели этот синтаксис I in X-1..X+1?   -  person    schedule 15.05.2013
comment
Я видел синтаксис в примере пролога в сети, я не думаю, что он был для SWI-Prolog, я обнаружил, что для циклов синтаксис выглядит следующим образом: "?- foreach(between(1,4,X), dif(X,Y)), Y = 5." так как мне переписать цикл?   -  person Bogdan    schedule 15.05.2013
comment
Это о циклах B-Prolog!   -  person false    schedule 24.01.2014


Ответы (1)


В Прологе нет таких циклов. Я также не уверен, разумно ли использовать assert для динамического изменения базы данных фактов (обычно лучше представлять ваши данные в виде структуры). Но если вы действительно настаиваете на использовании «цикла» из-за его побочных эффектов, вам следует использовать forall:

?- forall( between(-1,1,X), format('~d~n', [X]) ).
-1
0
1
true.
person Community    schedule 15.05.2013
comment
Я попробовал это для всех (между (X-1, X + 1, I), формат ('~ d ~ n', [I])), но если я даю значение 6, я получаю эту ошибку: ОШИБКА: между/3: Ошибка типа: integer' expected, found 6-1' - person Bogdan; 15.05.2013
comment
Да, сначала вам нужно вычислить целочисленное выражение 6-1 (или X-1) до целого числа, используя is/2; затем вы можете вставить его в between/3. В общем, поэтому я и сказал, что в Прологе нет настоящих циклов, он не предназначен для такого использования и, соответственно, вам нужно писать больше. - person ; 15.05.2013