Ответ 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".