2016-04-11 8 views
1

После загрузки следующей программы с помощью SWI-Prolog и ввода запросов, таких какКак избежать Out of global stack ERROR при поиске нескольких ответов?

cells([o,x,o,x,o], A). 

или

cells(A, [o,x,o,x,o]). 

первого результат, кажется, всегда быть правильными, но после подачи с запятой искать больше результатов (и я не знаю, должны ли быть дополнительные результаты в любом случае), я получаю ERROR SYSTEM PROLOG, в котором упоминается сбор мусора и ошибка внешнего глобального стека.

regla(o,o,o,o). 
regla(x,o,o,x). 
regla(o,x,o,o). 
regla(o,o,x,x). 
regla(x,o,x,x). 
regla(x,x,o,x). 
regla(o,x,x,x). 
regla(x,x,x,o). 

cells([X | XS], [Y | YS]) :- 
    X = o, 
    Y = o, 
    length([X | XS], LX), 
    LX >= 3, 
    length([Y | YS], LY), 
    LY is LX + 2, 
    append([o, o], [X | XS], W), 
    append(W, [o, o], Z), 
    cellsR(Z, [Y | YS]). 

cellsR(_, []). 
cellsR([A, B, C | R], [H | T]) :- 
    regla(A, B, C, H), 
    cellsR([B, C | R], T). 

Я предполагаю, что ошибки должны делать с тем, как я обрабатывать рекурсию, так что, может быть, кто-то может взглянуть на код и скажите мне, где я буду неправильно.

+0

Вы должны сделать «trace», и вы увидите, что происходит. – lurker

ответ

3

Мой первый совет: не используйте индикатор. Это не поможет вам. Прекращение действия слишком сложно, чем то, что может показать вам шаг за шагом. Позвольте мне дать вам причину, почему ваша программа не завершается, первый:

 
cells([X | XS], [Y | YS]) :- 
    X = o, 
    Y = o, 
    length([X | XS], LX), 
    LX >= 3, 
    length([Y | YS], LY), false, 
    LY is LX + 2, 
    append([o, o], [X | XS], W), 
    append(W, [o, o], Z), 
    cellsR(Z, [Y | YS]). 

Это подчеркивает часть вашей программы, которые вы будете иметь изменить, чтобы удалить вашу проблему. Другими словами, до тех пор, пока вы оставите эту часть без изменений, ваша проблема не исчезнет.

Минимальное изменение, чтобы добавить еще один гол, который устанавливает соотношение между длиной этих двух списков первых, до того length/2 используется:

cells([X | XS], [Y | YS]) :- 
    X = o, 
    Y = o, 
    list_samelength([_,_|XS], YS), 
    length([X | XS], LX), 
    LX >= 3, 
    length([Y | YS], LY), 
    LY is LX + 2, 
    append([o, o], [X | XS], W), 
    append(W, [o, o], Z), 
    cellsR(Z, [Y | YS]). 

list_samelength([], []). 
list_samelength([_|Xs], [_|Ys]) :- 
    list_samelength(Xs, Ys). 

Смотрите подробнее об этой методике.

+0

Спасибо за ответ! Решение, которое вы предлагаете, похоже, делает трюк, и я полагаю, что это означает, что эта часть кода теперь не нужна '([Y | YS], LY), LY - LX + 2, потому что list_samelength уже проверяет это. Я не понимаю, почему это произойдет. – luckysori

+0

@luckysori: почему бы ** то, что случилось? – false

+0

отсутствие прекращения в моей оригинальной программе. Я вижу, где я ошибся, но не почему. – luckysori

 Смежные вопросы

  • Нет связанных вопросов^_^