Определим предикат 'отобспис' такой, что целевое утверждение 'отобспис'(Р,L,М) согласуется c базой данных, применяя предикат Р к каждому элементу списка L и, образуя в результате новый список М. При этом предполагается, что предикат Р имеет два аргумента: первый аргумент для передачи "входного" элемента, а второй - для измененного элемента, подлежащего включению в список М.
'отобспис'(_,[],[]).
'отобспис'(Р,[Х|L],[Y|М]:-Q=..[P,X,Y],call(Q),'отобспис'(Р,L,М).
'заменить'('YOU','I').
'заменить'('ARE',['AM','NOT']).
'заменить'(Х,Х).
?- 'отобспис'('заменить',['YOU','ARE','A','COMPUTER'],Z).
Z=['I',['AM','NOT'],'A','COMPUTER'].
Путем упрощения предиката 'отобспис' получается предикат 'обрабспис', который просто обрабатывает список, применяя некоторый предикат от одного аргумента к каждому элементу списка. При этом новый список не порождается.
'отобспис'(_,[]).
'отобспис'(P,[X|L]):-Q=..[P,X],call(Q), 'отобспис'(P,L).
Отображение применимо не только к спискам, оно может быть определено для структуры любого вида.
|