Пролог: избыточные программные точки в срезе-срезе?

Мы внедряем диагностические инструменты для объяснения неожиданного универсального отсутствия завершения в чистых, монотонных программах Prolog - на основе концепции среза-отказа.

Как показано в статье " Локализация и объяснение причин неконтролирующих логических программ со срезами ошибок ", цели false/0 добавляются в нескольких точках программы, чтобы уменьшить размеры фрагментов программы кандидатов-объяснений (при этом сохраняя незавершенность).

Пока все хорошо... Итак, вот мой вопрос 1:

Почему в предложении N+1 программных баллов, имеющих N целей?

Или, точнее:

Почему N баллов не хватает? Нужен ли нам (N+1)-й программный пункт?

Не могли бы мы переместить это false вместо каждого использования предиката беспокойства?

Также мы знаем, что фрагмент программы используется только для запросов типа ?- G, false.

Сноска 1: Мы принимаем каждый факт foo(bar,baz). считается правилом foo(bar,baz) :- true. ,

1 ответ

Решение

Почему в предложении N+1 программных баллов, имеющих N целей? Почему N баллов не хватает?

Во многих примерах не все пункты действительно полезны. Точка после головы в предикате с одним предложением является таким примером. Но программные пункты здесь для использования в любой программе.

Давайте попробуем несколько примеров.

N = 0

Факт - это пункт с нулевыми целями. Теперь даже факт может или не может способствовать не прекращению. Как в:

?- p.

p :-
  q(1).
  p.

q(1).
q(2).

Нам нужен программный пункт для каждого факта q/1, даже если у него нет цели вообще, так как минимальный срез:

? - р, ложь.

п:-
   д (1),
   р, ложь.

д (1).
q (2): - неверно.

N = 1

п:-
   кв,
   п.
п:-
   п.

q:-
   сс
с:-
   s.

Итак, вот вопрос: нужны ли нам две программные точки в q/0? Ну да, есть разные независимые срезы сбоев. Иногда с false в начале, а иногда и в конце.

Что немного сбивает с толку, так это то, что первая программная точка (то есть точка в запросе) всегда true и последнее всегда false, Так что их можно было бы удалить, но я думаю, что было бы яснее оставить их как false в конце концов, это то, что вы должны войти в Пролог в любом случае. Смотрите пример в Приложении. Там, P0 = 1, P8 = 0 жестко закодировано.

Другие вопросы по тегам