Индексирование списка.
Задача получения N-ro терма в списке
определяется следующим образом:
Граничное условие:
Первый терм в списке [Н|Т] есть Н.
Рекурсивное условие:
N-й терм в списке [Н|Т] является (N-I)-м термом в списке Т.
Данному определению соответствует программа:
/* Граничное условие:
получить ([H|Т], 1, Н). /* Рекурсивное условие:
получить([Н|Т], N, У) :-
М is N-1,
получить (Т, М ,Y).
Построение списков из фактов.
Иногда бывает полезно представить в
виде списка информацию, содержащуюся в известных фактах. В
большинстве реализаций Пролога есть необходимые для этого предикаты:
bagof(X,Y,L)
— определяет список термов
L
, конкретизирующих
переменную
Х
как аргумент предиката
Y
, которые делают истинным предикат
Y.
setof(X,Y,L)
— все сказанное о предикате
bagof
относится и к
setof
,
за исключением того, что список
L
отсортирован и из него удалены все
повторения.
Если имеются факты:
собака(рекс).
собака(голди).
собака(фидо).
собака(реке).
135
то на запрос
?- bagof(D, co6aкa(D), L),
будет получен ответ
L=[реке, голди, фидо, рекс]
в то время как
?-setof(D, co6aкa(D), L).
дает значение
L=[фидо, голди, рекc]
14.7.3 Сложение многочленов
Теперь мы достаточно подготовлены к тому, чтобы использовать
списки для решения задач. Вопрос, которым мы займемся, — представление
и сложение многочленов.
Представление многочленов.
Посмотрим, как можно представить
многочлен вида
Р(х)=3+3х-4х^3+2х^9
Q(х)=4х+х^2-3х^3+7х^4+8х^5
Заметим, что каждое подвыражение (такое, как
3х^3, 3х, 3
) имеет
самое большее две переменные компоненты: число, стоящее перед
х
,
называемое коэффициентом, и число, стоящее после
^
- степень.
Следовательно, подвыражение представляется термом
х(Коэффициент, Степень)
Так,
5х^2
записывается как
х(5,2)
,
х^3
представляется как
х(1,3)
, а
поскольку
х^0
равно 1, подвыражению 5 соответствует терм
х(5,0)
.
Теперь запишем многочлен в виде списка. Приведенный выше
многочлен
Р(х)
, например, будет выглядеть следующим образом:
[x(3,0), '+', x(3,l), '-', x(4,3), '+', x(2,9)]
Воспользуемся тем, что многочлен
3+3х-4х^3+2х^9
допускает замену на эквивалентный
3+3х+(-4)х^3+2х^9
Тогда он выражается списком:
[х(3,0), '+', х(3,1), '+', х(-4,3), '+', х(2,9)]
В такой записи между термами всегда стоят знаки
'+'
. Следовательно,
их можно опустить, и многочлен принимает окончательный вид:
[х(3,0), х(3,1), х(-4,3), х(2,9)]
136
Подразумевается, что между всеми термами списка стоят знаки '
+
'.
Представлением многочлена
Q(x)
будет
[х(4,1), х(1,2), х(-3,3), х(7,4), х(8,5)]
Сложение многочленов. Теперь напишем целевые утверждения для
сложения двух многочленов. Сложение многочленов
3-2х^2+4х^3+6х^6
-1+3х^2-4х^3
в результате дает
2+х^2+6х^6
Аргументами
целевого
утверждения
являются
многочлены,
представленные в виде списков. Ответ будет получен также в виде списка.
Do'stlaringiz bilan baham: |