Почему в Prolog предикат member/2 печатает лишний пробел в выводе?

Я действительно не понимаю, почему Пролог печатает один пробел только после предиката member/2. Ниже текст из моей консоли.

?- member(1, [1, 2, 3]).
true .

?- string("why").
true.

Это действительно сводит меня с ума!


person Jimbo    schedule 30.11.2017    source источник
comment
В первом случае true является результатом и подсказкой, ожидающей, что вы наберете что-то, чтобы сказать Прологу, что делать дальше. Я предполагаю, что точка, которую вы показываете, связана с тем, что вы нажали ., но вы могли нажать ; или какую-либо другую допустимую команду, которую она ожидает. Во втором случае это просто результат без запроса ввода. Это довольно ясно. Не нужно паниковать. Просто дышать...   -  person lurker    schedule 30.11.2017
comment
Большое спасибо за это объяснение! Я писал синтаксический анализатор и думал, что это действительно может испортить синтаксический анализ символов, но, к счастью, это не так!   -  person Jimbo    schedule 30.11.2017
comment
Да, здесь вы просто имеете дело с артефактом человеческого взаимодействия. Результат, который вы видите, не возвращается буквально предикатами при вызове в программе. Они просто визуально указывают на успех или неудачу вызова предиката для пользователя.   -  person lurker    schedule 30.11.2017


Ответы (1)


Эта функция предназначена для того, чтобы показать, что вы фактически прервали запрос на верхнем уровне. Давайте рассмотрим более явный случай, когда вы изначально получаете:

?- member(1,[1,1]).
true 

Здесь Пролог подтверждает, что это правда, но все еще ждет вашего ответа. Если вы попросите больше с помощью ПРОБЕЛ или ;, вы получите следующее решение:

?- member(1,[1,1]).
true ;
true.

Однако, если вы нажмете Return или ., Prolog прервет ваш запрос. Чтобы показать это на экране, вставляется дополнительный пробел:

?- member(1,[1,1]).
true .

Традиционно многие реализации никогда не запрашивали альтернативы при наземных запросах, если сам запрос не содержал никакой переменной. Эта «оптимизация» часто скрывала неожиданные петли.

В вашем примере Пролог не знал, возможен ли дальнейший ответ, поэтому он подсказывает на данный момент. Если вы затем попросите больше, вы получите:

?- member(1, [1, 2, 3]).
true ;
false.

что говорит о том, что дальнейшего решения нет.

person false    schedule 30.11.2017