Объединение списка Меркурий - PullRequest
0 голосов
/ 26 сентября 2018

Я пытаюсь выучить Меркурий .Я возился со списками, но я не могу заставить работать, казалось бы, простое объединение.Вот мой уменьшенный пример:

main(!IO) :-
  [X,Y] = List,
  List = [1,2], % Error
  io.write(List, !IO),
  io.nl(!IO).

В строке List = [1,2] я получаю следующую ошибку (отформатированную и слегка отредактированную):

main.m:024: In clause for `main(di, uo)':
mode error in unification of `List' and `list.[V_11 | V_21]'.
Variable `List' has instantiatedness
`unique(list.'[|]'(free, unique(list.'[|]'(free, unique((list.[]))))))', 
term `list.[V_11 | V_21]' has instantiatedness
`list.'[|]'( unique(1), free )'.

Это не кажется правильным, хотя;в частности, экземпляр [1,2].Это буквально;не должно ли его создание быть, например, list.'[|]'( unique(1), list.'[|]'( unique(2), [] ) )?

Связано ли это как-то с той же проблемой частичного создания экземпляров, что и здесь ?

1 Ответ

0 голосов
/ 27 сентября 2018

Чтобы скомпилировать программу с корректным режимом, Mercury будет переупорядочивать цели в соединении, чтобы попытаться создать программу с корректным режимом, но перед этим она также разбивает сложные фрагменты на части.Похоже, что Меркурий изо всех сил пытается переупорядочить части этих двух объединений, чтобы сделать программу с корректным режимом, хотя (на мой взгляд) это должно быть возможно.Попробуйте изменить порядок первых двух голов.

...