В приведенном ниже запросе сначала я получаю X = H128
, откуда это взялось? Кроме того, почему он возвращает да? Это потому, что переменная X
на самом деле не определена, и мы проверяем это условие?
?- not(X==3).
X = H128
yes
В приведенном ниже запросе сначала я получаю X = H128
, откуда это взялось? Кроме того, почему он возвращает да? Это потому, что переменная X
на самом деле не определена, и мы проверяем это условие?
?- not(X==3).
X = H128
yes
В вашем запросе используется неопределенная переменная (X). При проверке того, создан ли X с термином 3 it (X==3), происходит сбой, потому что X не является экземпляром.
Следовательно, not(X==3) будет успешным, так как механизм пролога не может доказать X==3. Таким образом, ваш интерпретатор пролога возвращает «да» (из-за отрицания как неудачного подхода интерпретатора), а X остается нереализованным.
Вот почему интерпретатор показывает X = H128, где H128 — фиктивная переменная без конкретизации.
Каким было ваше первоначальное намерение? Возможно, вы хотели указать, что X
не равно 3. Для неравенства многие системы Prolog предлагают dif/2
:
?- dif(X,3).
dif(X,3).
В этом запросе мы запрашиваем значения для X
, которые не равны 3. Итак, какие значения не равны? На самом деле довольно много: придумайте 1
, 2
, термин 3+3
, c
, список [2,3,4]
и многое другое. Таким образом, предоставление конкретного ответа, такого как X = 4
, исключило бы многие другие правильные ответы. Однако ответ здесь таков: запрос выполняется для всех X
, которые не равны 3. Таким образом, фактическая оценка откладывается на более поздний момент.
?- dif(X,3), X = 3.
false.
Здесь мы попали в ситуацию, когда X
получил значение 3, что не соответствует действительности.
?- dif(X,3), X = 4.
X = 4.
А здесь принимается конкретное действительное значение, и ограничение dif(4,3)
снимается.
Да, потому что переменная X
не связана с первой целью, not(X==3)
. На самом деле метапредикат not/1
никогда не может создать привязку, даже если он успешен. Это потому, что успех not
означает, что внутренняя цель терпит неудачу. Обратите внимание, что not(X=3)
потерпит неудачу, потому что X=3
может завершиться успешно, когда X
свободен (и может быть привязан к значению 3).