2009-11-21 3 views
7

Я читал об этом в книге, но это не объяснялось вообще. Я также никогда не видел его в программе. Является частью синтаксиса Prolog? Для чего это? Вы используете его?Что такое оператор -> в Прологе и как его использовать?

Благодаря

+0

Я читал, что он может использоваться для написания парсеров. SUM -> O1 + O2 или что-то еще ... –

+2

То есть -> (обратите внимание на два символа), см. Руководство SWI: http://www.swi-prolog.org/pldoc/doc_for?object=section%282 % 2c% 20% 274.12% 27% 2c% 20swi% 28% 27% 2fdoc% 2fManual% 2fDCG.html% 27% 29% 29 – starblue

ответ

7

Он представляет импликации. Правая сторона выполняется только в том случае, если левая сторона истинна. Таким образом, если у вас есть этот код,

implication(X) :- 
    (X = a -> 
    write('Argument a received.'), nl 
    ; X = b -> 
    write('Argument b received.'), nl 
    ; 
    write('Received unknown argument.'), nl 
). 

Тогда он будет писать разные вещи в зависимости от него аргумент: (. link to documentation)

?- implication(a). 
Argument a received. 
true. 

?- implication(b). 
Argument b received. 
true. 

?- implication(c). 
Received unknown argument. 
true. 

+0

Подождите, если это подразумевается, тогда логическое 'false -> false' должно выдавать' true ', когда на самом деле этого не происходит. Что с этим? –

+0

@ BłażejMichalik не логическая импликация, а императив if-then-else, с неявным разрезом внутри него. –

2

Это локальная версия разреза, см например, section on control predicated в руководстве SWI.

В основном используется для реализации if-then-else посредством (condition -> true-branch; false-branch). Как только условие выполнено успешно, нет возврата от истинной ветви назад к условию или в ложную ветвь, но возврат из if-then-else по-прежнему возможен. Поэтому он называется местным разрезом или мягким разрезом.

+0

Мягкий разрез доступен в SWI через «* ->», а не «->»! – mat

0

Можно избежать использования этого, написав что-то более многословное. Если я переписать Stephan's предикат:

implication(X) :- 
    (
    X = a, 
    write('Argument a received.'), nl 
    ; 
    X = b, 
    write('Argument b received.'), nl 
    ; 
    X \= a, 
    X \= b, 
    write('Received unknown argument.'), nl 
). 

(. Да, я не думаю, что есть какие-либо проблемы с использованием его, но мой босс был параноиком об этом по какой-то причине, так что мы всегда использовали выше подход)

С любой версией вам нужно быть осторожным, чтобы вы охватывали все случаи, которые собираетесь накрыть, особенно если у вас много ветвей.

ETA: Я не уверен, что это полностью эквивалентно Stephan's, из-за возврата, если у вас есть implication(X). Но сейчас у меня нет интерпретатора Prolog для проверки.

+0

Хм. Я не столько в Прологе, но, похоже, это нарушает принцип DRY. Не уверен, что это того стоит! Я имею в виду, особенно если предпосылки становятся немного более сложными, это может стать беспорядочным. Что касается обратного слежения: для этой версии (SWI-) пролог не сразу возвращается в приглашение на 'implication (a)' и 'implication (b)', так что действительно будет предпринято какое-то обратное отслеживание. – Stephan202

+0

Да, я определенно не говорю, что это превосходная альтернатива, просто это альтернатива. :) – pfctdayelise

 Смежные вопросы

  • Нет связанных вопросов^_^