Как отмечалось в другом ответе StackOverflow, который я больше не могу найти, этот шаблон часто встречается в практическом коде Prolog:
pred(X) :-
guard(X),
...
pred(X) :-
\+ guard(X),
...
и многие люди пытаются сжать это до
pred(X) :-
(guard(X) ->
...
;
...).
Однако, как все мы знаем, структура стрелок разрушает точки выбора и не логична.
В Indexing dif / 2 предиката, называемого if_/3
, Ульриха Ноймеркеля и Стефана Краля предлагается, что монотонно и логично, однако в статье упоминается еще одна конструкция, которая привлекла мое внимание: *->
.
Конструкция *->
функционирует в точности так же, как и приведенный выше пример с несахарным защитным условием, и, таким образом, кажется идеальным для моих применений, поскольку я не хочу иметь овеществленное условие, которое требуется if_/3
, и мне наплевать на дополнительные точки выбора. Если я не ошибаюсь (отредактируйте: я), он предлагает ту же семантику, что и if_/3
, но без требования добавления «реификации» к предикату условия.
Однако в документации SWI для него утверждается, что " эта конструкция используется редко », что мне кажется странным. *->
мне кажется, что это строго лучше, чем ->
, когда вы пытаетесь заниматься чисто логическим программированием. Есть ли причина избегать этой структуры, или есть еще лучшая альтернатива всему шаблону защитного предложения / отрицательного защитного предложения?
if_/3
. Вы ошибаетесь. См. 2 Декларативные ограничения if-then-else в Prolog, последний абзац: Даже «мягкие» версииif/3
и(*->)/2
SICStus и SWI соответственно демонстрируют те же проблемы, что и Необоснованное отрицание Пролога. - person false   schedule 31.10.2018if/3
(неэффективно, поскольку он запускает охрану дважды):if(G_0, Then_0, _) :- G_0, Then_0. if(G_0, _, Else_0) :- \+ G_0, Else_0.
Вы видите\+
? Он полон нечистоты! - person false   schedule 01.11.2018