В чем разница между: - и? - в Прологе? - PullRequest
0 голосов
/ 24 октября 2018

Эта программа Prolog печатает Hello:

main :-
    write('Hello'), nl.

:- main.

Я изменил (:-)/1 на (?-)/1:

main :-
    write('Hello'), nl.

?- main.

Это дает точно такой же результат.Это также печатает Hello.

Так в чем же разница между (:-)/1 и (?-)/1?

Ответы [ 3 ]

0 голосов
/ 24 октября 2018

И :-, и ?- определены как префиксные операторы в стандарте ISO Prolog Core:

Priority   Specifier   Operator(s)
...
1200       fx          :- ?-

Префиксный оператор ?- имеет в основном исторические причины.Его семантика такая же, как у префиксного оператора :-, хотя я не нашел в стандарте утверждения, поясняющего его, кроме упомянутого в ответе Маркуса.

0 голосов
/ 25 октября 2018

В ISO Prolog, :- используется только для таких директив, как объявления операторов.Оператор ?- также определен, но ему никакого значения не дано.

Эти операторы являются производными от системы DEC 10 Пролог ~ 1978 года, где они назывались команда и вопрос соответственно.В то время как :- p(X). только что проверил на успех p(X) во время консультации, ?- p(X). показал реальный ответ и запросил дальнейшие ответы.Таким образом, вы получили некоторое взаимодействие при загрузке ваших файлов, которое было прекращено в последующих системах, заставляя обоих операторов вести себя одинаково.

Начиная с DEC10, многие системы выводят ?- в качестве приглашения для цикла верхнего уровня, напоминая, чтоследующий прочитанный термин будет интерпретирован и получен ответ как вопрос.Некоторые системы идут еще дальше и добавляют подсказку интерпретатора | перед ней.

0 голосов
/ 24 октября 2018

Аргумент term с главным функтором (:-)/1 называется директивой .В стандарте Prolog это определено в 7.4.2 Директив.

Кроме того, 5.5.5 заявляет:

Процессор может поддерживать один или несколько дополнительных указателей директивы (7.4.2) какособенность реализации.

Так, в некоторых системах Prolog, (?-)/1 доступен в качестве дополнительного указателя директивы.

...