Практическая информатика


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


сумма_списка([],0). сумма_списка([H|T],S):- number(H), сумма_списка(T,S1), S is S1+H.

Пример

Предикат место/3 успешен, если третий аргумент есть список, полученный вставкой первого аргумента в произвольное место списка, являющегося вторым аргументом.

место(E, L, [E|L]). место(E, [H|L], [H|Y]):- место(E, L,Y).

Посмотрим на результаты некоторых запросов, использующих этот предикат.

?- место(1,[2,3],X). X = [1, 2, 3] ; X = [2, 1, 3] ; X = [2, 3, 1] ; No

?- место(1,L,[2,1,3]). L = [2, 3] ; No

?- место(X,[2,3],[2,1,3]). X = 1 ; No

Пример

Предикат перестановка/2 выдает списки, полученные перестановкой элементов своего первого аргумента.

перестановка([],[]). перестановка([H|L],Z):- перестановка(L,Y), место(H,Y,Z).

Пример использования:

?- перестановка([a,b,c],X). X = [a, b, c] ; X = [b, a, c] ; X = [b, c, a] ; X = [a, c, b] ; X = [c, a, b] ; X = [c, b, a] ; No

И, наконец, приведем правило для печати всех возможных перестановок списка:

все_перестановки(L):- перестановка(L,R), write(R), nl, fail.

Первая подцель предиката вычисляет очередную перестановку, печатает ее и переходит к последней подцели - fail. Эта подцель всегда неуспешна, что заставляет Пролог вернуться к началу правила и продолжить поиск решения. Работа процедуры завершится, когда все перестановки будут исчерпаны:

?- все_перестановки(['маркиза', 'ваши прекрасные глаза', | 'сулят мне смерть от любви']).

[маркиза, ваши прекрасные глаза, сулят мне смерть от любви] [ваши прекрасные глаза, маркиза, сулят мне смерть от любви] [ваши прекрасные глаза, сулят мне смерть от любви, маркиза] [маркиза, сулят мне смерть от любви, ваши прекрасные глаза] [сулят мне смерть от любви, маркиза, ваши прекрасные глаза] [сулят мне смерть от любви, ваши прекрасные глаза, маркиза]

No

Пример

В старояпонском календаре был принят 60-летний цикл, состоящий из пяти 12-летних подциклов. Подциклы обозначались названиями цветов: зеленый, красный, желтый, белый и черный. Внутри каждого подцикла года носили названия животных: крыса, корова, тигр, заяц, дракон, змея, лошадь, овца, обезьяна, курица, собака и свинья.


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