Я работаю с матрицей, где каждый подсписком является строкой:пролог матрицы обработки столбца
Matrix =[[-,-,-,-,a,-],
[-,-,-,-,b,-],
[-,-,-,-,a,-],
[-,-,-,-,d,a],
[-,-,-,-,a,a],
[-,-,a,a,a,a],
[-,-,-,-,d,a]].
Моей цель состоит в том, чтобы найти, если есть четыре последовательные позиций в подсписка с тем же символом, который послал.
veryRow(_,[]).
veryRow(X,[T|TS]) :- row(X,T), veryRow(X,TS).
row(X,[A,B,C,D|_]) :- A \= X; B \= X; C \= X; D \= X.
row(X,[_|Xs]):- row(X,Xs).
Должен возвращать true, когда подсписку четыре последовательных элемента.
моего imputs является:
veryRow(a,[[-,-,-,-,a,-],
[-,-,-,-,b,-],
[-,-,-,-,a,-],
[-,-,-,-,d,a],
[-,-,-,-,a,a],
[-,-,a,a,a,a],
[-,-,-,-,d,a]]).
Потому что не нашли?
Благодаря
'veryRow 'будет терпеть неудачу, как только найдет строку, которая не удастся для' row'. – lurker
но с разрезом «!». Не прекращает выполнение, если строка верна? – Merche
Это никогда не заходит так далеко. Разрезание предотвращает откат только для большего количества растворенных веществ * если * вызов 'row' преуспевает. Для первой строки во втором аргументе 'veryRow (X, [T | TS])' терпит неудачу, потому что 'T' не имеет 4 последовательных' X '. И 'veryRow (_, [])' fail, потому что второй аргумент не пустой список. Таким образом, предикат полностью терпит неудачу. Ваша логика для 'veryRow' требует, чтобы' row' был успешным. – lurker