Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
пособие_Пролог_часть1.doc
Скачиваний:
44
Добавлен:
13.11.2019
Размер:
1 Мб
Скачать
☆
      1. Предикат delete.

Предикат delete(X,L,M) принимает значение “истина”, если список M получается в результате удаления первого вхождения терма Х из списка L. Схема отношения этого предиката имеет вид:

delete(<терм>,<список>,<список>).

Декларативное описание предиката next формулируется следующим образом:

  • Если X голова списка L, то предикат delete(X,L, M) истинен и M есть хвост списка L.

  • Если X принадлежит хвосту списка, то предикат delete необходимо применить к хвосту списка L.

  • Если X не принадлежит списку L, то предикат delete(X,L, M) ложен.

Процедура delete(X,Y,L) состоит из двух правил:

delete(X,[X|B],B):!.

delete(X,[Y|L],[Y|M]): delete(X,L,M).

Рассмотрим пример запроса к процедуре delete(X,Y,L).

?  delete(3,[1,2,3,4],M).

ТР: delete(3,[1,2,3,4],M).

Шаг 1: ТЦ: delete(3,[1,2,3,4],M).

Пр1: delete(3,[1|2,3,4]],M)  неуспех (3 не сопоставимо с 1)

Пр2: delete(3,[1|[2,3,4]],[1|M1]): delete(3,[2,3,4],M1).

M=[1|M1]

ТР: delete(3,[2,3,4],M1).

Шаг 2: ТЦ: delete(3,[2,3,4],M2).

Пр1: delete(3,[2|[3,4]],M2)  неуспех (3 не сопоставимо с 2)

Пр2: delete(3,[2|[3,4]],[2|M2]): delete(3,[3,4],M2).

M1=[2|M2]

ТР: delete(3,[3,4],M2).

Шаг 3: ТЦ: delete(3,[3,4],M2).

Пр1: delete(3,[3|[4]], M2)  успех (3 сопоставимо с 3)

при подстановке M2=[4]

Переход на шаг 2, и конкретизация переменной M1 значением [2|[4]] или [2,4].

Переход на шаг 1, и конкретизация переменной M значением [1|[2,4]] или [1,2,4].

ТР: .

Результат вычисления запроса: delete(3,[1,2,3,4],M).  успех при подстановке {M=[1,2,4]}.

5.4.10. Предикат number_list.

Предикат number_list(L) определяет, является ли список X списком числовых термов. Схема отношения этого предиката имеет вид:

number_list(<список>).

Декларативное описание предиката number_list(L)формулируется следующим образом:

  • Список L включает один элемент Х. Тогда предикат number_list([X]) истинен, если X числовой терм.

  • Список L можно разделить на голову Н и хвост Xs. Тогда L есть список числовых термов, если H числовой терм и хвост списка есть список числовых термов.

Процедура number_list(X,Y) состоит из двух правил:

number_list([]): number(X).

number_list(X,[_|T]):  number(X),number_list(X,T). Предикат number(X) стандартный предикат системы Arity Prolog, этот предикат истинен, если Х  числовой терм.

Рассмотрим пример запроса к процедуре number_list(Х).

?  number_list([1,2,3,4]).

ТР: number_list([1,2,3,4]).

Шаг 1: ТЦ: number_list([1,2,3,4]).

Пр1: [X]=[1,2,3,4] неуспех (списки разной длины)

Пр2: number_list([1|[2,3,4]]): number(1),number_list([2,3,4]).

ТР: number(1),number_list([2,3,4]).

Шаг 2: ТЦ: number(1) успех

ТР: number_list([2,3,4]).

Шаг 3: ТЦ: number_list([2,3,4]).

Пр1: [X]=[2,3,4] неуспех (списки разной длины)

Пр2: number_list([2|[3,4]]): number(2),number_list([3,4]).

ТР: number(2),number_list([2,3,4]).

Шаг 4: ТЦ: number(2) успех

ТР: number_list([3,4]).

Шаг 5: ТЦ: number_list([3,4]).

Пр1: [X]=[3,4] неуспех (списки разной длины)

Пр2: number_list([3|[4]]): number(3),number_list([4]).

ТР: number(3),number_list([4]).

Шаг 6: ТЦ: number(3) успех

ТР: number_list([4]).

Шаг 7: ТЦ: number_list([4]).

Пр1: [X]=[4] успех (списки одинаковой длины) при подстановке {X=4}

ТР: number(4).

Шаг 8: ТЦ: number(4) успех

ТР:  успех.

Результат вычисления запроса number_list(3,[1,2,3,4]).  успех.