обновить элемент в списке списка в прологе - PullRequest
0 голосов
/ 20 мая 2018

У меня есть список списка и список.Я хочу обновить список, используя элемент из второго списка.

Например:

У меня есть список списка [[banan, NA], [apple, NA]] и список [sweet, notsweet], хочу обновить списокlist, так что у меня будет список list [[banana, sweet], [apple, notsweet]]

Я попробовал приведенный ниже код, но думаю, что не могу понять базовый вариант правильно.

update([[]],[],[]).
update([[T|_]|HH],[FB|H2],[NState|_]) :-
   NState=[T|FB],
   update(HH,H2,NState). 

Любая помощь, будет очень признателен

спасибо

1 Ответ

0 голосов
/ 20 мая 2018

Ты почти у цели.Сначала давайте заметим, что первый список пуст, если не осталось больше пар [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]].
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...