Да, мы можем реализовать это в ISO Prolog и даже в XSB, но не очень эффективно. Чтобы сделать это эффективным, вам понадобится «выборочное сокращение». Кроме того, XSB не реализует целые числа, соответствующие ISO, поэтому переполнение должно обрабатываться отдельно.
:- dynamic(if_counter/1).
if_counter(0).
:- dynamic(no_if_answer/1).
if(If_0, Then_0, Else_0) :-
once(if_counter(Id)),
Idx is Id+1,
( Idx > Id -> true
; throw(error(representation_error(max_integer),
'XSB misses ISO conforming integers'))
),
retractall(if_counter(_)),
asserta(if_counter(Idx)),
asserta(no_if_answer(Id)),
( If_0,
retractall(no_if_answer(Id)),
Then_0
; retract(no_if_answer(Id)) ->
Else_0
).
Основной источник неэффективности заключается в том, что для определенного условия If_0
все еще остается точка выбора. Почти немыслимо мыслить, что реализация может прийти к выводу, что retract(no_if_answer(Id))
всегда будет терпеть неудачу после выполнения retractall(no_if_answer(Id))
, но я сомневаюсь, что разработчики будут вкладывать средства в такие оптимизации. РЕДАКТИРОВАТЬ: причина, по которой это кажется маловероятным, заключается в том, что реализация должна гарантировать, что заявленные числа всегда растут.
Обратите внимание, что мягкий разрез создает неполноту точно так же, как и разрез. Рассмотреть возможность:
| ?- if(X = a, T = equal, T = not_equal).
X = a
T = equal;
no
Это явно пропускает ответ! Чтобы понять почему, возьмите X = b
:
| ?- X = b, if(X = a, T = equal, T = not_equal).
X = b
T = not_equal;
no
| ?- if(X = a, T = equal, T = not_equal), X = b.
no % bad!!
Конъюнкция должна быть коммутативной (по модулю незавершения, ошибок, побочных эффектов).
Если вы заинтересованы в декларативно обоснованных условных выражениях, которые также очень эффективны и часто быстрее, чем их нечистые аналоги, рассмотрите if_/3
. См. library(reif)
для SICStus, который дает все правильные ответы:
| ?- if_(X = a, T = equal, T = not_equal).
X = a,
T = equal ? ;
T = not_equal,
prolog:dif(X,a) ? ;
no
person
false
schedule
16.11.2016
if/3
, как это делает SICStus. Кроме того, зачем вам нужна эта конструкция? Обратите внимание, что вы не получаете монотонность с ним. Он имеет те же недостатки, что и отрицание в стиле Пролога. - person false   schedule 16.11.2016