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

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

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

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

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

Или, точнее:

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

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

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

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


person repeat    schedule 14.02.2016    source источник
comment
Извините за шум, но мои сомнения могут быть связаны с вашим ... Я не понимаю обозначений из примера первой статьи (Пример 1): P0, ... P5 представлены, поэтому изображенный фрагмент {0, 2,4} должно быть - наивно - {5,1,3}. Такое несоответствие мешает мне следить за остальной частью документа. Должен ли каждый индекс «программной точки» быть смещен на 1 (но что тогда происходит с P0)? Может ли это объяснить ваше недоумение?   -  person CapelliC    schedule 15.02.2016
comment
@CapelliC. Нет, я понимаю (думаю). Рассмотрим псевдокод на странице 9: slicep(...,FVect) ← arg(n1,FVect,1), sliceq(...,FVect), arg(n2,FVect,1), ..., arg(ni,FVect,1), slicer(...,FVect), arg(ni+1,FVect,1). Итак, IMO, проблема на основе 0 и 1 возникает только из-за использования arg/3, чтобы гарантировать, что мы не пройдем мимо вставленной цели false. Итак, я бы сказал, что причина того, что индексы, основанные на 0/1, - это использование arg/3, вы не согласны?   -  person repeat    schedule 15.02.2016
comment
Я не могу судить ... как я уже сказал, первоначальное недоразумение делает мое чтение очень хрупким (надеюсь, это имеет смысл на английском языке)   -  person CapelliC    schedule 15.02.2016
comment
@CapelliC: с помощью {5,1,3} вы выделяете пункты, которые должны быть ложными, но на самом деле упоминаются пункты, которые должны быть истинными.   -  person false    schedule 15.02.2016
comment
@repeat: Дополнительная проблема: как вы обрабатываете предикаты более высокого порядка. Я этого не делал, но очень хотелось бы.   -  person false    schedule 15.02.2016
comment
@ложный. Я тоже хотел бы это иметь! На данный момент я не ... На первый взгляд, я бы сказал, что использование дополнительного аргумента (для передачи логического вектора) проблематично. Используя дополнительный модуль и некоторые глобальные переменные, хотя и некрасиво, может работать IMO.   -  person repeat    schedule 15.02.2016


Ответы (1)


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

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

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

N = 0

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

?- p.

p :-
  q(1).
  p.

q(1).
q(2).

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

?- p, false.

p :-
   q(1),
   p, false.

q(1).
q(2) :- false.

N = 1

p :-
   q,
   p.
p :-
   p.

q :-
   s.

s.
s :-
   s.

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

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

person false    schedule 15.02.2016
comment
Хорошо знать! Собственно, я думал в том же духе относительно false в конце запроса ... - person repeat; 15.02.2016
comment
@repeat: обратите внимание, что 0 не сразу переводится в индекс с _2 _... - person false; 15.02.2016