Почему `X=1,X=1.` печатает `X=1` вместо `true`

Я изучаю основы Пролога, и мне интересно, почему следующая строка печатает X = 1 вместо true?

?- X=1,1=X.
X = 1.

--

Первое X=1 в моей команде — это присваивание, а второе будет проверкой на равенство.


person Stav Alfi    schedule 06.03.2020    source источник
comment
Очень просто, это то, что делают верхние уровни Пролога (также известные как REPL). Они собирают все свободные переменные в запросе и показывают их значения при каждом успешном выполнении. Вероятно, это произвольный выбор. Некоторые реализации могут никогда не показывать ничего, если это явно не запрошено в запросе. Некоторые не отображают значения переменных, начинающихся со знака подчеркивания, например _X. Вероятно, все никогда не будут показывать значение _ (т.е. анонимной переменной). И добро пожаловать в Пролог! :)   -  person Will Ness    schedule 06.03.2020


Ответы (2)


В вашем запросе нет присваиваний или тестов на равенство, только унификация терминов. Запрос выполняется за счет объединения переменной X с 1, и это то, о чем сообщает верхний уровень: он сообщает, какие привязки переменных делают запрос верным.

После того, как первая цель в соединении, X = 1, успешна, вторая цель — это объединение 1 = 1, которое тривиально удается.

P.S. Также обратите внимание, что системы Prolog различаются тем, как они сообщают об успешных запросах. Некоторые печатают true, другие печатают yes (традиционный способ сообщения об успешных запросах).

person Paulo Moura    schedule 06.03.2020
comment
Спасибо. Я немного смущен. как я понял от вас 1=1. тоже унификация. Итак, почему 1=1. печатает true, а X=1,1=X. печатает X=1? - person Stav Alfi; 06.03.2020
comment
Объединение 1 = 1 выполняется без привязки каких-либо переменных. Таким образом, в этом случае интерпретатор верхнего уровня просто напечатает true (или yes в зависимости от используемой системы Пролога). - person Paulo Moura; 06.03.2020

Если ответ true и значение привязано к переменной на верхнем уровне, отображается значение переменной, что означает, что результат был истинным.

Вот несколько примеров.

test_01 :-
    X = 1,
    X = 1.

test_02 :-
    X = 1,
    X = 2.

test_03(X) :-
    X = 1,
    X = 1.

test_04(X) :-
    X = 1,
    X = 2.

и когда примеры запускаются с верхнего уровня с использованием SWI-Prolog

?- test_01.
true.

?- test_02.
false.

?- test_03(X).
X = 1.

?- test_04(X).
false.

Вот несколько примеров, которые выполняются только на верхнем уровне

?- X=1.
X = 1.

?- 1=1.
true.

?- 1=0.
false.

?- 1==0.
false.

Первый X=1 в моей команде — это присваивание, а второй — проверка на равенство.

X=1 — это не присваивание, а объединение целого числа 1 с переменной X. Второй X=1 не является проверкой на равенство, это еще одно объединение X с 1, но поскольку X к этому моменту привязано к 1, это действительно другое объединение.

Чтобы выполнить проверку на равенство в Прологе, используйте ==, например.

?- 1 == 1.
true.

?- 1 == 2.
false.

Также , является логическим и, поэтому, если

?- X = 1.
X = 1.

тогда 1 привязан к X и является истинным и аналогичным для второй строки в вашем вопросе.


Однако код также следует рассматривать как

?- true,true.
true.

в отличие от

?- true,false.
false.

Пока ; логично или

?- true;true.
true ;
true.

?- true;false.
true ;
false.

?- true;false;true.
true ;
true.

?- false;true.
true.

?-  false;false.
false.

Обратите внимание, что первые 3 ответа имеют 2 результата, а последние два ответа имеют 1 результат.

person Guy Coder    schedule 06.03.2020
comment
Спасибо, можете объяснить, почему Notice that the first 3 answers have 2 results, but the last two answers have 1 result. ? - person Stav Alfi; 06.03.2020
comment
Если вы запустите другие примеры, подобные этому, вы обнаружите, что результаты false не возвращаются, если только это не последний результат. - person Guy Coder; 06.03.2020