Программирование на языке Пролог | страница 126
исключ1(А,[А|L],L):-!.
исключ1(А,[В|L],[В|М]):- исключ1(А,L,М).
Легко добавить утверждение, которое обеспечит доказательство предиката, когда второй аргумент сократится до пустого списка. Это утверждение, реализующее новое граничное условие, есть исключ1(_,[],[])-
Исключение всех вхождений некоторого элемента; Цель исключить(Х, L1, L2) создает список L2 путем удаления всех элементов X из списка L1. Граничное условие выполняется тогда, когда L1 является пустым списком. Это означает, что мы рекурсивно исчерпали весь список. Если X находится в голове списка, то результатом является хвост этого списка, из которого X тоже удаляется. Последний случай возникает, если во втором аргументе обнаружено, что-то отличное от X. Тогда мы просто входим в новую рекурсию.
исключить(_, [],[]).
исключить(Х,[Х|L],М):-!, исключить(Х,L,М).
исключить(Х,[Y|L1],[Y|L2]):- исключить(Х,L1,L2).
Замещение: Этот предикат очень напоминает исключить, с той лишь разницей, что вместо удаления искомого элемента мы заменяем его некоторым другим элементом. Цель заменить(Х, L,A,M) строит новый список М из элементов списка L, при этом все элементы X заменяются на элементы А. Здесь возможны 3 случая. Первый, связанный с граничным условием, в точности совпадает с тем, что было в исключить. Второй случай – когда в голове второго аргумента содержится элемент X, а третий – когда там содержится нечто отличное от X:
заменить(_,[],_,[]).
заменить(Х,[Х|L],А,[А|М]):-!, заменить(Х,L,А,М).
заменить(Х,[Y|L],А,[Y|М]):- заменить(Х,L,А,М).
Подсписки: Список X является подсписком списка Y, если каждый элемент X содержится и в Y с сохранением порядка следования и без разрывов. Например, доказуемо следующее:
подсписок[[собрание, членов, клуба],[общее, собрание, членов, клуба, будет, созвано, позже]).
Программа подсписок требует двух предикатов: один для нахождения совпадения с первым элементом, и второй, чтобы убедиться, что остальная часть первого аргумента поэлементно совпадает с соответствующей частью второго аргумента.
подсписок([Х|L],[Х|М]):- совпало(L,M),!.
подсписок(L,[_|М]):- подсписок(L,M).
совпало([],_).
совпало([Х|L],[Х|М]):- совпало(L,М).
Отображение: Это мощный метод, заключающийся в преобразовании одного списка в другой с применением к каждому элементу первого списка некоторой функции и использованием ее результата в качестве очередного элемента второго списка. Программа преобразования одного предложения в другое, которая рассматривалась в гл. 3, является одним из примеров отображения. Мы говорим, что «отображаем одно предложение в другое».