SWI-Prolog версии 8.0.3 для x64-win64 с использованием yall
для лямбда-выражений. (use_module(library(yall)).
)
Попытка получить доступ к значению в dict внутри labmda вызывает ошибку. Я думаю, что это не столько проблема с yall
, сколько проблема с диктовками в... давайте назовем их "цель как ценность", потому что я не уверен в правильном термине. (Например, X = (Y = 1)
.) Примером, представляющим мою актуальную проблему, будет ?- L = [S]>>(S=a{x:_},S.x = 10).
, но для начала я приведу более простой пример.
Рассмотреть:
?- L = (S=a{x:_},S.x = 10).
ERROR: Arguments are not sufficiently instantiated
ERROR: In:
ERROR: [11] throw(error(instantiation_error,_11412))
ERROR: [8] '<meta-call>'(user:(...,...)) <foreign>
ERROR: [7] <user>
ERROR:
ERROR: Note: some frames are missing due to last-call optimization.
ERROR: Re-run your program in debug mode (:- debug.) to get more detail.
Когда вместо этого я ожидал бы чего-то вроде следующего:
?- L = (S=a{x:_},S.x = 10).
L = (S=a{x:_14168}, S.x=10).
Возвращаясь к лямбда-выражениям, обратите внимание, что мое намерение может быть выполнено, например, с помощью
?- L = [S]>>(S=a{x:_},(.(S,x,10))).
L = [S]>>(S=a{x:_8692}, '.'(S, x, 10)).
Это просто ужасно. (Вызов этой лямбды дает S = a{x:10}
, как и ожидалось.)
Это похоже на ошибку в SWI-Prolog или, по крайней мере, на недокументированное ограничение. Я что-то пропустил, или мне нужно написать отчет об ошибке?
1 ответ
Как показывает ваш запрос L = (S=a{x:_},S.x = 10)
, ошибка не имеет ничего общего с library(yall)
, а связана с семантикой dicts. При использовании функциональной записи, например S.x = 10
, SWI-Prolog выполняет усердную оценку S.x
во время компиляции запроса, то есть до достижения цели S=a{x:_}
. Отсюда и ошибка инстанцирования. Как вы обнаружили, отказ от использования функциональной записи путем переключения на цель '.'(S, x, 10)
решает проблему, поскольку она становится второй целью, доказываемой на конъюнкции.
Похожие вопросы
Новые вопросы
dictionary
Словарь сопоставляет ключи со значениями, позволяя эффективно извлекать значения по ключам. ИСПОЛЬЗУЙТЕ [map-function] ТЕГ для функций отображения; а по географии - [карты].