Ты почти у цели.Сначала давайте заметим, что первый список пуст, если не осталось больше пар [fruit,*]
, поэтому первый аргумент вашего базового случая должен быть []
.В этот момент другие списки также должны быть пустыми, поскольку они имеют одинаковую длину.
Как правило, первый список будет иметь двухэлементный список в качестве заголовка, первым из которых является вашобъект интереса и второй из которых вас не волнует, то есть что-то вроде [X,_]
.Хвост этого списка будет содержать еще X
, так что давайте, возможно, назовем его Xs
.Тогда первый аргумент выглядит как [[X,_]|Xs]
.Второй аргумент - это плоский список, поэтому вы можете написать [Y|Ys]
(читается как: список начинается с Y
, за которым следуют Y
).Последний аргумент - это двухэлементный список [X,Y]
, за которым следуют другие такие пары (XY
), следовательно: [[X,Y]|XYs]
.Отношение должно выполняться и для хвостов, что можно описать рекурсивной целью.Вы можете выразить вышеизложенное в Прологе так:
update([],[],[]).
update([[X,_]|Xs],[Y|Ys],[[X,Y]|XYs]) :-
update(Xs,Ys,XYs).
С этими изменениями в вашем предикате пример запроса из вашего комментария дает желаемый ответ:
?- update([[banana,*],[apple,*]],[sweet,notsweet],C).
C = [[banana, sweet], [apple, notsweet]].