Кадр 1:26 — С чем объединяется q?
У нас есть:
(run* q
(fresh (x)
(==
`(,x)
q)))
В этом случае `(,x)
это список, в котором ссылка на переменную не заключена в кавычки.
Унифицируется ли q со списком из одного элемента?
Является результатом(_0)
потому чтоq
объединяется со свежей переменнойx
(даже если он есть в списке) или потому что он вообще ни с чем не унифицируется? Или в этом случае результат был бы()
?
1 ответ
Унифицируется ли список с одним элементом?
Да.(== (list x) q)
такой же как(== q (list x))
. Оба и свежи до выполнения этой цели объединения (и не встречаются в ). После этого в подстановке записывается, что значение равно . Значение для не записывается.
Является результатом
(_0)
потому что унифицируется со свежей переменной (даже если она есть в списке) или потому что вообще ни с чем не унифицируется? Или в этом случае результат был бы()
?
Нет, объединяется не с , а со списком, содержащим .
Когда конечное значение всегоrun*
возвращается выражение, переменные "овеществляются", заменяются их значениями. не имеет значения для замены, поэтому оно печатается как , внутри списка, как это бывает, какой список является значением, связанным с .
Значением является список всех допустимых присвоений, как обычно. Существует только одна такая ассоциация для переменной и значения(list x)
.
Так( (_0) )
должно быть напечатано как значение(run* q ...)
выражение -- список из одного значения дляq
, который представляет собой список, содержащий неконкретизированный x
, представленный как значение_0
.