Скачиваний:
222
Добавлен:
17.06.2016
Размер:
2.69 Mб
Скачать

Еще об изменении списков

Конечно, не всегда нужно заменять каждый элемент. Далее следует

программа, которая просматривает список из чисел и делает из него копию,

отбрасывая отрицательные числа.

/* Программа CH08EX05.PRO - Просмотр списка чисел, отбрасы-

вание отрицательных*/

domains

list = integer*

predicates

discsrd_negatives(list, list)

clauses

discsrd_negatives([], []).

discsrd_negatives([H|T], ProcessedTail) :-

/* если H отрицательно, то пропустить*/

H < 0,

!,

discsrd_negatives(T, ProcessedTail).

discsrd_negatives([H|T], [H|ProcessedTail]) :-

discsrd_negatives(T, ProcessedTail).

К примеру, целевое утверждение

discsrd_negatives([2, -45, 3, 468], X)

присвоит X=[2, 3, 468].

Далее приведем предикат, который копирует элементы списка, заставляя

каждый элемент появляться дважды:

doubletalk([], []).

doubletalk([H|T], [H, H|DoubledTail]) :-

doubletalk(T, DubledTail).

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

Предположим, что у вас есть список имен John, Leonapd, Eric и Frank,

и вы хотите используя Турбо Пролог проверить имеется ли заданное имя в

этом списке. Другими словами, вам нужно выяснить отношение "Принадлеж-

ность" между двумя аргументами - именем и списком имен. Это выражается

предикатом

member(name, namelist). /* "name" принадлежит "namelist"*/

В программе CH08EX06.PRO первое предложение проверяет голову списка.

Если голова списка совпадает с именем, которое вы ищете, то можно заклю-

чить, что имя принадлежит списку. Так как хвост списка не представляет

интереса, он обозначается неопределенной переменной. По первому предложе-

нию целевое утверждение

member(john, [john, leonard, eric, frank])

будет выполнено.

/*Программа CH08EX06.PRO - принадлежность к списку*/

domains

namelist = name*

name = symbol

predicates

member(name, namelist)

clauses

member(Name, [Name|_]).

member(Name, [_|Tail]) :- member(Name, Tail).

Если голова списка не совпадает с Name (имя), то нужно проверить,

можно ли Name найти в хвосте списка.

На обычном языке:

Имя принадлежит списку, если имя есть первый элемент списка или Имя

принадлежит списку, если имя принадлежит хвосту.

Второе предложение в Турбо Прологе, выражающее отношение принадлеж-

ности выглядит так:

member(Name, [_|Tail]) :- member(Name, Tail).

Упражнение

1. Загрузите программу CH08EX06.PRO и попробуйте выполнить целевое

утверждение:

member(susan, [ian, susan, john]).

2. Добавьте domain и предикатные утверждения таким образом, чтобы

установить принадлежность числа числовому списку. Поробуйте несколь-

ко целевых утверждений, включая

member(X, [1, 2, 3, 4]).

для проверки вашей новой программы.

3. Имеет ли значение порядок написания двух предложений для предика-

та member? Посмотрите, как ведет себя программа, если поменять мес-

тами два предложения. Различие обнаружится при выполнении целевого

утверждения

member(X, [1, 2, 3, 4, 5])

для обоих случаев.

Соседние файлы в папке Документация