мне нужно написать предикат partition/2
таким образом, что partition(L, P)
удовлетворяется, когда конкатенация каждого списка в список списков P
так же, как список L
. Список списков P
может содержать произвольное количество списков.В список списков, Append все списки вместе в один список
Пример запросов:
? - partition ([1 ,2 ,3] , P).
P = [[1] , [2] , [3]];
P = [[1] , [2 , 3]];
P = [[1 , 2] , [3]];
P = [[1 , 2 , 3]];
no
? - partition (L , [[1] ,[2] ,[3 ,4 ,5]]).
L = [1 , 2 , 3 , 4 , 5];
no
Я попытался конкатенации списков в P
вместе, то проверять, если она равна L
. Это то, что у меня есть, но это не работает. Он бесконечно петляет для любого P
, который содержит более 1 списка.
partition([], []). ;; Partition of empty list is the empty list
partition(L, [L]). ;; Base case where if P contains 1 element (list), L is equal to this list.
partition(L, [X|[Y1|Y2]]) :-
append(X, Y1, XY1),
partition(L, [XY1|Y2]). ;; Append each list in P to the list after it, repeating until one list is created. X is the head of the list, Y1 is the second element, and Y2 is the rest of the list.
Любая помощь приветствуется.