Пролог: избыточные программные точки в срезе-срезе?
Мы внедряем диагностические инструменты для объяснения неожиданного универсального отсутствия завершения в чистых, монотонных программах 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
жестко закодировано.