Этот
(list[elem, elem2], list[elem3, elem4], list[elem5, elem6]).
недопустим в Прологе.
[]
означает, что это список, поэтому он не может быть фактом или предикатом, что означает, что вы не можетепоместите имя функтора перед [
.
(A,B,C)
известно как кортеж в других языках программирования или структура в Prolog.
Если вы хотите использоватьмножественный список в структуре в Прологе вы можете думать о нем как о
(A,B,C)
, где A, B и C. могут быть списками.
Примеры со значениями
([],[],[])
([a],[b],[c])
([],[a,b,c],[d,e,g])
или для вашего конкретного случая
([elem1,elem2],[elem3,elem4],[elem5,elem6])
Вы также можете создать составной термин
list(A,B,C)
Примеры со значениями
list([],[],[])
list([a],[b],[c])
list([],[a,b,c],[d,e,g])
list([elem1,elem2],[elem3,elem4],[elem5,elem6])
Помните, что список - это на самом деле термины в сочетании с оператором cons или ./2
и является синтаксическим сахаром .Это можно увидеть, используя write_canonical/1
с GNU Prolog.
?- write_canonical(([1,2],[3,4],[5,6])).
','('.'(1,'.'(2,[])),','('.'(3,'.'(4,[])),'.'(5,'.'(6,[]))))
или
?- write_canonical(list([1,2],[3,4],[5,6])).
list('.'(elem1,'.'(elem2,[])),'.'(elem3,'.'(elem4,[])),'.'(elem5,'.'(elem6,[])))
Когда вы пытаетесь использовать слово list
в качестве функтора для списка []
Например, list[a,b]
вы не можете, потому что в списке уже есть функтор .
.Это синтаксический сахар, который скрывает функтор .
.Причина, по которой некоторым из нас легко запомнить это, состоит в том, что в таких языках, как Lisp, они все еще используют cons
или когда синтаксический сахар для списка не известен парсеру, тогда вы быстро узнаете, как использовать cons
.
После комментария от OP
это должно быть [list (elem, elem1), list (elem2, elem3)]
Теперь у вас естьlist []
с условиями списка, являющимися составными терминами list(X,Y)
Это допустимый пролог.
write_canonical([list(elem1,elem2),list(elem3,elem4),list(elem5,elem6)]).
'.'(list(elem1,elem2),'.'(list(elem3,elem4),'.'(list(elem5,elem6),[])))
или для выделения оператора .
как
'.'(
list(elem1,elem2),
'.'(
list(elem3,elem4),
'.'(
list(elem5,elem6),
[]
)
)
)
Обратите внимание, что для каждого .
есть два аргумента.Аргументы могут быть структурой или составной структурой, такой как list(elem1,elem2)
, другой .
с двумя аргументами или пустым списком, []
.