
- •7. Списки в Прологе
- •Определение и унификация
- •Упражнения на унификацию
- •Рассмотрим ещё несколько примеров
- •7.2 Операции на списках
- •7.2.1 Поиск элемента в списке
- •7.2.2 Создание списков
- •7.2.2.1 Простейший случай
- •7.2.2.2 Получение списка из двух существующих списков
- •7.2.2.3 Получение списка по условию
- •7.2.2.4 Вычеркивание элементов списка
- •7.2.2.5 Замена элементов списка
- •7.2.2.6 Проверка, является ли аргумент списком.
- •7.2.2.7 Подсчет количества элементов в списке.
- •7.2.2.9 Вывод списка на дисплей.
- •7.3 Задачи на списках
- •7.3.1 Нахождение путей в связанном неориентированном графе
- •7.3.2 Синтаксический анализатор на дка
7. Списки в Прологе
Определение и унификация
Список - это упорядоченная последовательность элементов, которая может иметь любую длину. В Прологе они используются там, где обычно в других языках использовались бы массивы. Элементы списка могут быть константами, целыми числами, вещественными числами, атомами, переменными, фактами и даже правилами.
Как структура данных Пролога, они имеют следующий синтаксис
они всегда заключаются в квадратные скобки и
каждый элемент списка отделяется запятой.
Вот примеры списков
[a,fred,A_Variable,ququ]
[a, b, c, d, e, f, г]
[apple,pear,bananas,bedfruit]
[] /* это - пустой спискок, */
Существует специальный символ | (чёрточка, англ. - bar) , чтобы отделить первый элемент списка (называемую головой ) от остальной части списка (известную как хвост).
Для примера рассмотрим шаблон [A|B] и следующий список [first,second,third]
При унификации A свяжется с первым элементом списка, а B с остатком списка, т.е. получится
A=first и B=[second,third]
Упражнения на унификацию
-
Список
Шаблон
Результат
1
[a, b, c]
[Head|Tail]
Head=a
Tail=[b, c]
2
[a]
[H|T]
H=a
T=[]
3
[]
[H|T]
false.
4
[[]]
[B|Rest]
B = Rest, Rest = [].
!! На самом деле: B = [],Rest = [] !!
5
[a, b, c]
[a|T]
T=[b, c] (унифицируется только переменная!)
6
[a, b, c]
[b|T]
false.
7
[]
[]
true.
Два пустых списка всегда согласовываются
Рассмотрим ещё несколько примеров
?- [One, Two | T] = [яблоко, малина, черника, milk].
One = яблоко,
Two = малина,
T = [черника, milk].
?- [X,Y|T] = [a|Z].
X = a,
Z = [Y|T].
Здесь Z=[Y|T], а поскольку это переменная, которой надо иметь значение.
?- [H|T] = [груша, Z].
H = груша,
T = [Z].
Если бы было сравнение[…,T]=[…,Z], то унификация была бы Z=T
Найдите результаты унификации следующих списков (для одного из них унификация неуспешна).
-
Список
шаблон
ответ
[a, d, z, c]
[H|T]
H=a,
T=[d, z, c]
[маша,даша,саша]
[A,даша|Rest]
A = маша,
Rest = [саша].
[a|Rest]
[a, b, c]
Rest=[b, c]
[a,[]]
[
A,B|Rest]
A = a,
B = Rest,
Rest = [].
(см №4 из упр7.1.1. )
[One]
[two|[]]
One=two
[one]
[Two]
Two=one
[a, b, X]
[a, b, c, d]
false.