Основы современных компьютерных технологий


Списки - часть 2


score([1,3,5,7,9]).

Ниже приведены примеры внешних запросов к программе и получаемые при этом результаты:

Запрос Результат
nате(Х) Х= ["Петров П. Р.", "Иванов Б. О.", "Сидоров Т. К."].
name([_, Y, _]) Y="Иванов Б. О."
score([A,B,_,_,C]) A=1,B=3,C=9

При использовании в Пролог-программе списков с произвольным числом элементов используется метод разделения списка на голову и хвост. Этот метод обеспечивает рекурсивную обработку списка. Операция разделения списка на голову и хвост в языке Турбо-Пролог обозначается вертикальной чертой (|) и записывается в виде:

[Head | Tail]

Здесь: Head - переменная для обозначения головы списка; Tail - переменная для обозначения хвоста списка.

Пример 1. Рассмотрим программу распечатки содержимого списка, элементы которого могут быть целыми числами или символьными строками:

domains


Iist1=integer*

320

Iist2=symbol*

predicates


printjist(listl)

print_list(list2)

clauses


print_list([]).

print_list([Head|Tail]):-write(Head),

nl,

print_list(Tail).

goal


print_list([1,2,3,4]).

В данной программе предикат списка print_list() описан для двух типов доменов, поэтому с его помощью могут обрабатываться списки, элементами которых являются как целые числа, так и символьные строки. В программе реализован рекурсивный метод обработки.

Первое правило программы print_list([]) описывает тот факт, что пустой список не нужно печатать, оно же является условием выхода из рекурсии, используемым во втором правиле - печать списка завершается тогда, когда список пуст. Опишем работу программы.

Первоначально аргумент целевого внутреннего запроса printjist([1,2,3,4]) сопоставляется с первым вариантом правила; сопоставление терпит неуспех, так как [1,2,3,4]#[]. Затем выбирается второй вариант правила, здесь сопоставление завершается успехом и выполняется операция - разделения целевого списка на голову и хвост. Результатом ее является означение Head=1 и Tail=[2,3,4]. Далее начинают последовательно выполняться предикаты тела правила.




Начало  Назад  Вперед