Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Шумихин / Шумихин / Шумихин - лекция 9

.txt
Скачиваний:
7
Добавлен:
20.05.2015
Размер:
3.62 Кб
Скачать
ЛЕКЦИЯ 9
2.11.12

ПРИМЕР 1
Предикат, который определяет, принадлежит ли элемент списку.
member(элемент, список)

member(N, [H|_]) :- H = N, !.
member(N, [_|T]) :- member(N, T).

member(N, [N|_]).
member(N, [_|T]) :- member(N, T).

member(2, [1,2,3]).
member(2, []).
member(X, [1,2,3]). -- полный перечень элементов списка, эту задачу не получится решить, если будет стоять отсечение в первом предложении

Предикат с таким именем есть в некоторых версиях пролога (SWI-Prolog), работают немного иначе. Можно использовать его, если посмотреть, как он работает.

ПРЕДИКАТ 2
Предикат, который объединяет два списка L1 и L2 в список L3.
append(L1, L2, L3) :-

append(L1, L2, L3) :- copy(L1, L3), copy(L2, L3).
copy([], _).
copy([H|T], [H|T1]) :- copy(T, T1).
???

append([], L, L).
append([X|L1], L2, [X|L3]) :- append(L1, L2, L3).

Основные прелести этого предиката на примере задач:

1.
append([1], [2,3], L)
Результат: L=[1,2,3].

2.
append(X, [2,3], [1,2,3]).
Что приписать к [1,2], чтобы получить [1,2,3].

append([1,2], X, [1,2,3,4]).
Аналогично.

3.
append(L1, L2, [1,2,3]).

L1=[], L2=[1,2,3]
L1=[1], L2=[1,2]
L1=[1,2], L2=[3]
L1=[1,2,3], L2=[]

ПОСМОТРЕТЬ РЕЖИМ ТРАССИРОВКИ.
На простых программах.

4.
Вызов, который разделит список на два слева и справа стоящих от указанного.
[1,2,3,4] на два: до 3 и после 3

append(X, [3|Y], [1,2,3,4]).

5.
Удалить все элементы из списка, начиная с указанного.

???

6.
Удалить все элементы до указанного.
append(L, [3|_], [1,2,3,4]).

7.
Определить последний элемент списка.
append(_, [X], [1,2,3,4]).

8.
Обращает список L1.
reverse(L1, L2)

reverse([], []).
reverse([X|T], L2) :- reverse(T, L3), append(L3, [X], L2).

9.
Предикат, который определяет, являются ли два элемента соседними в списке.

nei(N, M, L)

dbl(N, M, L) :- append(X, [M|_], L), append(_, [N], X).
dbl(N, M, L) :- append(X, [N|_], L), append(_, [M], X).

dbl(X, Y, L) :- append(_, [X|Y|_], L).
dbl(X, Y, L) :- append(_, [Y|X|_], L).

[X|Y|_] = [X, Y|_] = [X|[Y|_]]

10.
Описать предикат, определяющий, является ли список L палиндромом.
palindrom(L)

palindrom(L) :- reverse(L, L).

ПРЕДИКАТ 3
Предикат, который удаляет все вхождения элемента в список.

del_all(_, [], []).
del_all(X, [X|T], L1) :- del_all(X, T, L1).
del_all(X, [Y|T], [Y|T1]) :- X<>Y, del_all(X, T, T1).

ПРЕДИКАТ 4
Удаляет первое вхождение.

del_one(_, [], []) :- !.
del_one(X, [X|T], T) :- !.
del_one(X, [Y|T], [Y|T1]) :- del_one(X, T, T1).

ПРЕДИКАТ 5
Элемент списка по номеру.

n_element([H|_], 1, H) :- !.
n_element([_|L], N, X) :- NewN=N-1, n_element(T, NewN, X).
________________________________________________
Соседние файлы в папке Шумихин