Добавил:
Upload
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:
ЛЕКЦИЯ 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).
________________________________________________
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).
________________________________________________
Соседние файлы в папке Шумихин