
- 266 -
Пример 2. Предикат, позволяющий проверить принадлежность
элемента списку.
Решение
Предикат будет иметь два аргумента: первый – искомое значение,
второй – список, в котором производится поиск. Используем тот факт, что
объект принадлежит списку, если он либо является первым элементом
списка, либо элементом хвоста.
Это может быть записано в виде двух предложений:
member(X,[X|_]). /* X — первый элемент списка */
member(X,[_|T]) :–
member(X,T). /* X принадлежит хвосту T*/
Примечание. Заметим, что в первом случае (когда первый элемент
списка совпадает с исходным элементом), неважно, какой у списка хвост, и
можно в качестве хвоста указать анонимную переменную. Аналогично, во
втором случае, если X принадлежит хвосту, не важно, какой элемент первый.
Пример 3. Предикат, позволяющий соединить два списка в один.
Решение
Первые два аргумента предиката будут представлять соединяемые
списки, а третий – результат соединения.
В качестве основы для решения этой задачи возьмем рекурсию по
первому списку.
Базисом рекурсии будет факт, устанавливающий, что если
присоединить к списку пустой список, в результате получим исходный
список. Шаг рекурсии позволит создать правило, определяющее, что для
того, чтобы приписать элементы списка, состоящего из головы и хвоста, ко
второму списку, нужно соединить хвост и второй список, а затем к
результату приписать спереди первый элемент первого списка.
Пролог-программа:
conc([ ], L, L). /* при присоединении пустого списка
к списку L получим список L */
conc([H|T], L, [H|T1]) :–
conc(T,L,T1). /* соединяем хвост и список L, получаем
хвост результата */
Пример 4. Предикат, позволяющий «обратить» список (записать его
элементы в обратном порядке).
Решение
Предикат будет иметь два аргумента: первый – исходный список,
второй список, получающийся в результате записи элементов первого
аргумента в обратном порядке.
Решение будет рекурсивным. Базис: если записать элементы пустого
списка (которых нет) в обратном порядке – опять получим пустой список.
Шаг рекурсии: для того чтобы получить «перевернутый» список, можно