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
Erhannis 8 Ноя 2019 в 02:46

1 ответ

Как показывает ваш запрос L = (S=a{x:_},S.x = 10), ошибка не имеет ничего общего с library(yall), а связана с семантикой dicts. При использовании функциональной записи, например S.x = 10, SWI-Prolog выполняет усердную оценку S.x во время компиляции запроса, то есть до достижения цели S=a{x:_}. Отсюда и ошибка инстанцирования. Как вы обнаружили, отказ от использования функциональной записи путем переключения на цель '.'(S, x, 10) решает проблему, поскольку она становится второй целью, доказываемой на конъюнкции.

1
Paulo Moura 8 Ноя 2019 в 12:23
1
Это похоже на ошибку в SWI-Prolog или, по крайней мере, на недокументированное ограничение. Я что-то пропустил, или мне нужно написать отчет об ошибке?
 – 
Erhannis
8 Ноя 2019 в 18:32