Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Изменение списка
Иногда необходимо из списка создать другой. Это осуществляется последовательной обработкой элементов списка, заменяя каждый вычисленной величиной. 4. Следующий пример демонстрирует просмотр списка чисел и формирование нового, не учитывая отрицательные числа: DOMAINS list=integer*
PREDICATES discard_negatives(list, list)
CLAUSES discard_negatives([], []). discard_negatives([H|T], ProsessedTail): - H< 0,!, discard_negatives(T, ProsessedTail). discard_negatives([H|T], [H|ProsessedTail]): - discard_negatives(T, ProsessedTail).
GOAL discard_negatives([2, -45, 3, 468], X).
Пролог выдаст ответ (рис. 4): X=[2, 3, 468].
Рис. 4. Изменнённый список
Членство в списке 5. Предположим, что Вы имеете список с именами Джон, Леонард, Эрик, и Фрэнк и хотели бы использовать Visual Prolog для исследования, есть ли данное имя в этом списке. Другими словами, Вы должны выразить отношение «членство» между двумя параметрами: имя и список имен. Это соответствует предикату member(name, namelist). 6. Опишите разделы доменов, предикатов, предложений и задайте цель: DOMAINS namelist=name* name=symbol
PREDICATES nondeterm member(name, namelist)
CLAUSES member(Name, [Name|_]). member(Name, [_|Tail]): - member(Name, Tail).
GOAL member(john, [john, leonard, eric, frank]).
В Программе, первое предложение исследует голову списка. Если голова списка равна имени, которое Вы ищете, то Вы можете заключить, что имя - член списка. Так как хвостовая часть списка неинтересна, она обозначена анонимной переменной. Благодаря этому первому предложению, цель member(john, [john, leonard, eric, frank]) удовлетворена. 7. Пролог ответит yes (рис. 5). Рис. 5. Подтверждение членства в списке
Если голова списка не равна Name, Вы должны исследовать, может ли Name быть найдено в хвостовой части списка. Второе предложение member касается этих отношений. На Прологе: member(Name, [_|Tail]): - member(Name, Tail).
|