Понял ли понятие "полумет" в Прологе?

Будучи новым для Prolog, я наткнулся на очень интересное обсуждение

Вычисление, которое выполняется не более одного раза. Вычисление, которое после успеха не оставляет открытых точек выбора.

Ясно, что второе подразумевает первое, но не наоборот.

Читая поток, я понял, что первый из них был Dr.Neumerkel, второе - Drs.Wielemaker, O'Keefe и другие.

Попытка поиска, я видел, как некоторые исследователи баз данных "полу-детерминированный" запрос, который отвечал бы не более чем на одну эквивалентность класса, ближе к первому понятию.

Dr.Neumerkel говорит (ссылаясь на предикат под названием call_semidet там):

Реализация может быть улучшена, но до оптимизации и необходимо определить фактическое значение.

Итак, имеет ли смысл значение?

Как насчет 'det'?

Кажется обычным классифицировать предикаты в соответствии с их числом решений. В соответствии с (см. Ниже), "det" может делать в полном объеме недетерминированных (скажем, параллельных) вычислений при условии, что они решение, которое теперь гарантировано существует. Итак, по аналогии, я думаю, там может быть два понятия "det":

Вычисление, которое выполняется ровно один раз. Вычисление, которое преуспевает ровно один раз и которое после успеха оставляет нет точек выбора.

Первый является более логичным, но неразрешимым вообще до конца вычисление. Второе легко разрешимо, как только решение найдено, но процедурный и его значение зависит от конкретной стратегии поиска Prolog использует, т.е. первый поиск глубины.

Интересно, еще нет консенсуса сообщества? Почему бы не назвать эти две разные концепции по-разному?

Здесь выдержка из страницы SWI-Prolog выше:

det [детерминизм]

Сокращение для детерминированного.

детерминированным

Предикат является детерминированным, если ему удается ровно один раз    не оставляя точки выбора.

semidet

Сокращение для полудетерминированных.

полудетерминированный

Предикат, который является полудетерминированным, либо терпит неудачу, либо преуспевает    ровно один раз без точки выбора. См. Также детерминированный.

Ответ 1

Это действительно отличный вопрос!

Из категорий детерминизма ртути, где это также объясняется довольно авторитетно:

6.1 Категории детерминизма

Для каждого режима предиката или функции мы классифицируем этот режим в зависимости от того, сколько раз он может преуспеть, и может ли он потерпеть неудачу перед созданием своего первого решения.

Если все возможные вызовы в конкретный режим предиката или функции, которые возвращаются к вызывающему абоненту (вызовы, которые завершаются, не генерируют исключение и не вызывают фатальную ошибку времени выполнения)

  • имеет ровно одно решение, тогда этот режим является детерминированным (det);
  • либо не имеют решений, либо имеют одно решение, то этот режим является полудетерминированным (semidet);
  • имеет хотя бы одно решение, но может иметь больше, то этот режим является мультиразрешением (multi);
  • имеют ноль или более решений, тогда этот режим недетерминирован (nondet); сбой без создания решения, тогда этот режим имеет детерминизм отказа.

(подчеркивает мою)

Обратите внимание, что вопрос о том, оставлена ​​ли точка выбора, даже не упоминается в этом определении, ни в целом разделе. Меркурий - это не то же самое, что и Prolog, но дело в том, что это определение в принципе 100% применимо также к Prolog. Ясно, что тогда это соответствует вашему варианту (1).

На мой взгляд, это правильно: это то, остается ли или нет точка выбора, весьма несущественна и зависит от &mdash, например: насколько мощной и универсальной является ваша система индексирование аргументов. Хорошая схема индексирования может препятствовать созданию точек выбора, которые вводят другие системы. Понятие, которое зависит от конкретных особенностей конкретной системы Пролога и может прерываться от одной версии к следующей (с внедрением лучшего индексирования аргументов и т.д.), Не является очень надежным, а не большим значением.

Верно, что мы часто говорим, что "предикат является детерминированным", когда мы имеем в виду: "предикат детерминирован и не имеет точек выбора", но даже в этом случае почти всегда и в таких случаях предикат выполняется ровно один раз. Обратите внимание, что "детерминированный" является довольно перегруженным прилагательным с другими значениями В документации SWI эта двусмысленность переносится на полудетерминированный. Однако даже SWI-back-pedals немного отличается от этого скорее ориентированного на реализацию определения в других местах:

2.2.2 Тестирование полудетерминированных предикатов

Полудетерминированные предикаты являются предикатами, которые либо терпят неудачу, либо преуспевают ровно один раз, а для хорошо выполненных предикатов не оставляют никаких точек выбора.

Таким образом, полудетерминированный предикат, который не очень хорошо себя ведет (?), также может оставлять точки выбора...

В обсуждении обратите внимание, в частности, следующее: Ульрих здесь использует более слабую и более надежную концепцию для получения предиката, который применим для обоих определений.

Итак, независимо от того, какой вариант вы выбираете, call_semidet/1 полезен! Отсюда становится понятнее смысл цитаты. Когда Ульрих говорит:

(Реализация может быть улучшена, но перед оптимизацией и определением фактического значения необходимо решить.)

очевидно, не подразумевается, что значение "semidet" должно быть урегулировано между двумя вариантами, но сначала должно быть понятно, что действительно гарантирует call_semidet/1: это намного полезнее чем то, что думали Ульрих. Например, определение, которое дает Ян:

call_semidet(Goal) :- 
        call_cleanup(Goal, Det=true), 
        (   Det == true 
        ->  true 
        ;   throw(error(mode_error(semidet,Goal),_)) 
        ). 

работает только со вторым определением "semidet".

Ответ 2

Используемая в настоящее время классификация, например. в SWI-Prolog, как упоминалось в @mat, взято из Mercury. Используемые имена режимов (det, semidet, multi и nondet) являются очень плохими (и также недостаточными). Это не только аббревиатуры, но и новые пользователи ищут документацию, чтобы понять их смысл! По иронии судьбы, описание значения каждого из этих режимов уже предлагает лучшие не сокращенные и четкие имена. Вспоминая, что мы говорим о количестве решений: zero, one, zero_or_one, zero_or_more, one_or_more (и, возможно, из-за его полезности error, которые могут использоваться для указания что данный режим вызова приводит к ошибке). Это, кстати, имена режимов, используемые в Logtalk.

Смешение спецификации количества решений для предиката (в заданном режиме) с проблемами с оставшимися точками выбора также является плохим выбором, чередующимся с неоднозначностью, как описано в @mat. Проблемы оптимизации кода являются ортогональными к определению количества решений. Кроме того, любой режим, отличный от zero, может оставить ложную точку выбора, когда решения исчерпаны. Таким образом, это более общее, чем просто различие между слабо названными режимами det и semidet.