Программирование на языке Пролог | страница 57
Выход на граничное условие происходит, когда X является деталью. В этом случае X просто возвращается в качестве элементарного списка:
часть(Х, [X]):- деталь(Х).
Следующее условие связано со случаем, когда X является узлом. Здесь необходимо определить, имеется ли в базе данных соответствующий факт узел, и если такой имеется, то применить предикат часть к каждому элементу списка подчастей. Для выполнения второй из указанных задач используется предикат, названный список_частей.
часть(Х,Р):- узел(Х,Подчасти),
список_чаcтей(Подчасти, Р).
Предикат список_частей берет список частей (из второго аргумента факта узел, представленного выше) и применяет предикат часть к каждой части в списке. После вызова самого себя, необходимого для обработки хвоста списка, предикат список_частей должен склеить полученные списки вместе, используя предикат присоединить:
список_частей([Р|Хвост], Полный_список):- часть(Р,Части_головы)
список_частей(Хвост,Части_хвоста)
присоединить(Части_головы, Части_хвоста, Полный_список)
Список, созданный предикатом часть, не будет содержать информации о требуемом количестве деталей, при этом элементы списка могут дублироваться. В гл. 7 будет представлена улучшенная версия программы, в которой эти недостатки отсутствуют.
Существуют две идеи, указывающие, как использовать предикат часть для генерации предложений на английском языке. Во-первых, предложения могут быть представлены в виде иерархических структур: предложение имеет части группа_существительного и группа_глагола; группа_существительного состоит из определения и существительного и т. д. Так что любая простая грамматика может быть выражена на языке «частей». Во-вторых, предикат список_частей всегда обрабатывает элементы списка, представленного его первым аргументом, в порядке слева направо, и его результат (второй аргумент) накапливается в том же порядке. Два указанных свойства предиката часть показывают, что можно использовать тот же метод для генерации предложений по некоторой грамматике. Типичный «узел» в этой грамматике мог бы выглядеть так:
узел(предложение,[группа_существительного,группа_глагола]).
узел(группа_существительного,[определение,существительное]).
узел(определение,[thе]).