Вы получили ошибку, потому что =\=/2
истинно, если expr1
равно число , не равное expr2
. Вместо этого вы можете использовать \=\2
, который оценивает \+term1=term2
. ==/2
оценивается как term1 equivalent to term2
, =:=/
- истина, если expr1
- это число , которое равно до expr2
. Еще одна ошибка, которую я обнаружил в вашем коде, заключается в том, что вы не очищаете промежуточный список. Вы должны сбросить значения в нем после добавления аналогичного списка элементов в список Sublists
. Я использовал cut !
, чтобы уменьшить возврат. Вместо этого, если вы пишете взаимоисключающие предикаты, лучше.
Я отредактировал ваш код:
pack1([],[],[]).
pack1([H],L,[Z]):- append([H],L,Z),!.
pack1([H,H1|T],Z,X):- H == H1 , append([H],Z,Z1) , pack1([H1|T],Z1,X),!.
pack1([H,H1|T],Z,[Z1|Zs]):- H\=H1 ,append([H],Z,Z1) ,pack1([H1|T],[],Zs),!.
Вывод:
?-pack1([a,a,a,a,b,c,c,a,a,d,e,e,e,e],[],Z).
Z=[[a, a, a, a], [b], [c, c], [a, a], [d], [e, e, e, e]]
?-pack1([a,a,a,a,b,c,1,c,a,a,d,e,e,e,e],[],Z).
Z= [[a, a, a, a], [b], [c], [1], [c], [a, a], [d], [e, e, e, e]]
?-pack1([],[],Z).
Z= []
Надеюсь, это поможет.