Я читал об этом в книге, но это не объяснялось вообще. Я также никогда не видел его в программе. Является частью синтаксиса Prolog? Для чего это? Вы используете его?Что такое оператор -> в Прологе и как его использовать?
Благодаря
Я читал об этом в книге, но это не объяснялось вообще. Я также никогда не видел его в программе. Является частью синтаксиса Prolog? Для чего это? Вы используете его?Что такое оператор -> в Прологе и как его использовать?
Благодаря
Он представляет импликации. Правая сторона выполняется только в том случае, если левая сторона истинна. Таким образом, если у вас есть этот код,
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.
Подождите, если это подразумевается, тогда логическое 'false -> false' должно выдавать' true ', когда на самом деле этого не происходит. Что с этим? –
@ BłażejMichalik не логическая импликация, а императив if-then-else, с неявным разрезом внутри него. –
Это локальная версия разреза, см например, section on control predicated в руководстве SWI.
В основном используется для реализации if-then-else посредством (condition -> true-branch; false-branch). Как только условие выполнено успешно, нет возврата от истинной ветви назад к условию или в ложную ветвь, но возврат из if-then-else по-прежнему возможен. Поэтому он называется местным разрезом или мягким разрезом.
Мягкий разрез доступен в SWI через «* ->», а не «->»! – mat
Можно избежать использования этого, написав что-то более многословное. Если я переписать 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 для проверки.
Хм. Я не столько в Прологе, но, похоже, это нарушает принцип DRY. Не уверен, что это того стоит! Я имею в виду, особенно если предпосылки становятся немного более сложными, это может стать беспорядочным. Что касается обратного слежения: для этой версии (SWI-) пролог не сразу возвращается в приглашение на 'implication (a)' и 'implication (b)', так что действительно будет предпринято какое-то обратное отслеживание. – Stephan202
Да, я определенно не говорю, что это превосходная альтернатива, просто это альтернатива. :) – pfctdayelise
Я читал, что он может использоваться для написания парсеров. SUM -> O1 + O2 или что-то еще ... –
То есть -> (обратите внимание на два символа), см. Руководство 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