Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2docx-1.doc
Скачиваний:
3
Добавлен:
01.03.2025
Размер:
2.27 Mб
Скачать

21. Описание основных предикатов обработки списков: определение длины, взятие n-ого элемента, принадлежность элемента списку, конкатенация списков.

Определение длины:

    1. length([], 0).

    2. length([_|T], N) :- length(T, N1), N is N + 1.

    3. ?- length([a,b,c],N), write(N). % N=3

Взятие n-го элемента:

      1. getN([Elem|_], 1, Elem).

      2. getN([_|List], N, Elem):- M is N – 1,

      3. getN(List, M, Elem).

Принадлежность элемента списку

  1. member(X, [X|_]).

2 member(X, [_|T]):-

3 member(X,T).

4 ?-member(a,[b,a,c]). %yes

Добавление элемента append(A, B, C), C = A [B]

1 append([], X, [X]).

2 append([_|T], Y, [_|A]):-

3 append(T, Y, A).

Конкатенация списков extend(A, B, C), C = A B

1 extend([], X, X).

2 extend([_|T], Y, [_|A]):-

3 extend(T, Y, A).

Применение extend: 1.конкатенация extend([foo1], [foo2], C); 2.порождение разбиений extend(X, Y, [1,2,3]); 3. rem_first(N, L, R):- extend(X, L, R), length(X, N).; 4. last(X, L):- extend(_, [X], L).; 5. next(A, B, L):- extend(_, [A,B|_], L).; 6. sublist(R, L):- extend(_, T, L), extend(R, _, T).

22. Описание основных предикатов обработки списков: удаление элемента из списка, определение подсписка, перестановки.

Удаление элемента:

  1. remove(X, [X|T], T).

  2. remove(X, [h|t], [H|R]): —

  3. remove(X, T, R).

  4. ?-remove(a,[a,b,c],X). %X=[b,c]

Применение:

• Удаление

      1. ?— remove(блондинка, [блондинка, брюнетка, рыжая, блондинка], X)

      2. X = [брюнетка, рыжая, блондинка] X = [блондинка, брюнетка, рыжая]

• Генерация

        1. ?— remove(X,[бюст, талия, ноги], L)

        2. X =[бюст],L =[талия, ноги]; X=[талия], L=[бюст, ноги]; X =[ноги], L =[бюст, талия];

•member: member(X, L):— remove(X, L, _).

Определение подсписка:

          1. sublist(L, R): — append(_,T, L), append(R,_, L),

Перестановки: Вариант Никитина:

            1. permute([], []). перемешать([X], [X]).

            2. permute(L, [X|T]): — перемешать([X|L], R): —

            3. remove(X, L, R), перемешать( L, R1),

            4. permute(R, T). удалить(X, R, R1).

СемантикаДекларативная - симметрия. Императивная, если первая(вар. 1) переменная не конкретизирована - беско­нечное SLD-дерево.

23. Порядковое представление списков в Прологе. Представ-е матриц. Примеры.

Df Список - структ.для хран.потенц.беск.посл: •пустой сп. •структурный терм (t,l), где имя, t - произвольный терм (голова), l - список (хвост для (t,l)). Список Дерево. Постр-е: • [] - Пустой список. •.: (1, (2, (3, ))) = .(1,.(2,.(3, []))) • Скоб-очная нотация: (1, (2, (3, )))=[1,2,3].Наряду с обычным пр-м списков исп-ся поряд-ковое. Df Порядковое пр-е – такое пр-е списка, при кот. номеру эл-та соотв-ет его зна-чение. Матрицы. Список списков [[101,212],[333,411]] Порядковое представление

[ e(1,1,101), e(1,2,212),

e(2,1,333), e(2,2,411),]

Опер-и: опр-ие длины, взятие n-ого элемента, прин-ть эл-та сп., конкатенация сп-в, удал-е эл-та из списка, опр-е подсписка, перест-ки – анал-ны как и для простых сп-в, но возможны более эффект-е реализ-и. Например удале-ние 1го элемента (e(1, хз_чё)):

    1. rem_first([], []).

    2. rem_first([e(1, _)| X1 ], X2 ):-

    3. rem_first(X1, X2).

    4. rem_first([e(A1, B1)| X1 ], [e(A2, B2)| X2 ]):-

    5. X2 is X1 - 1,rem_first(X1, X2).

Связь порядковых и простых списков:

      1. c2o([], []).

      2. c2o(ListCommon, ListOdering):-

      3. c2o_util(ListCommon, 1, ListOdering).

      4. c2o_util([X], N, [e(N, X)]).

      5. c2o_util([X|ListCommon], N, [e(N, X)|ListOdering]):-

      6. N1 is N + 1,

      7. c2o_util(ListCommon, N1, ListOdering).

        1. ?- c2o([blonde, brunette , brown, red], X), write(X), fail.

        2. [e(1,blonde),e(2,brunette),e(3,brown),e(4,red)]

        3. ?- c2o(X, [e(1,blonde),e(2,brunette),e(3,brown),e(4,red)]), write(X), fail.

        4. [blonde,brunette,brown,red]