Я не думаю, что вы можете сделать это в «чистом» Прологе (хотя некоторые реализации могут позволить вам сделать что-то близкое, например, в ECLiPSe есть полки).
Причина:
1) Вы не можете писать вещи , такие как
list1 :- [4, 5, 6].
или
list1 = [4, 5, 6].
Поскольку правая и левая стороны являются терминами, которые неt match.
2) Вы не можете писать такие вещи , как
List1 :- [4, 5, 6].
или
List1 = [4, 5, 6].
, потому что левая сторона теперьпеременная, но переменные разрешены только в главах / телах предикатов.
Что вы могли бы сделать, это определить предикат с несколькими вариантами, например:
myList([1, 2, 3]).
myList([4, 5, 6]).
изатем получить все его значения с помощью bagof (или аналогичных предикатов):
predicate(L) :-
bagof(ML, myList(ML), MLs),
concat(MLs, L).
MLs
- это список всех ML
значений, которые удовлетворяют myList(ML)
и, конечно, concat
объединяет список списков.