Я изучаю основы Пролога, и мне интересно, почему следующая строка печатает X = 1
вместо true
?
?- X=1,1=X.
X = 1.
--
Первое X=1
в моей команде — это присваивание, а второе будет проверкой на равенство.
Я изучаю основы Пролога, и мне интересно, почему следующая строка печатает X = 1
вместо true
?
?- X=1,1=X.
X = 1.
--
Первое X=1
в моей команде — это присваивание, а второе будет проверкой на равенство.
В вашем запросе нет присваиваний или тестов на равенство, только унификация терминов. Запрос выполняется за счет объединения переменной X
с 1
, и это то, о чем сообщает верхний уровень: он сообщает, какие привязки переменных делают запрос верным.
После того, как первая цель в соединении, X = 1
, успешна, вторая цель — это объединение 1 = 1
, которое тривиально удается.
P.S. Также обратите внимание, что системы Prolog различаются тем, как они сообщают об успешных запросах. Некоторые печатают true
, другие печатают yes
(традиционный способ сообщения об успешных запросах).
1=1.
тоже унификация. Итак, почему 1=1.
печатает true
, а X=1,1=X.
печатает X=1
?
- person Stav Alfi; 06.03.2020
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 результат.
Notice that the first 3 answers have 2 results, but the last two answers have 1 result.
?
- person Stav Alfi; 06.03.2020
_X
. Вероятно, все никогда не будут показывать значение_
(т.е. анонимной переменной). И добро пожаловать в Пролог! :) - person Will Ness   schedule 06.03.2020