- Философия, эзотерика:
- Религии:
- Познавательное
(обо всём)
Программа «Голова-хвост списка» - демонстрация метода разделения списка на голову и хвост.
Так как предикат print_list опеределен для объектов обоих доменов, то это правило используется для работы как со списком number_list, так и списком animal_list.
Когда правило пытается удовлетворить внешнюю цель print_list([4,-9,5,3]) то первый вариант правила, print_list[], дает неуспех, так как объект этого правила - пустой список.
Введенный список соответствует объекту второго варианта предиката, print_list([Head|Tail]).
Переменной Head, следовательно, присваивается значение первого элемента в списке, 4, в то время как переменной Tail cтавится в соответствие оставшаяся часть списка, [-9,5,3].
Теперь, когда выделен первый элемент элемент списка, с ним можно обращаться так же, как и с любым простым объектом, например вывести его на экран - write(Head),nl.
Так как хвост списка есть список сам по себе, значение переменной Tail может быть использовано в качестве объекта рекурсивного вызова print_list:
print_list(Tail)
Когда испытывается данное подправило, Tail имеет значение [-9,5,3].
Снова не проходит первый вариант print_list[], и соответствие устанавливается при помощи второго.
Переменной Head присваивается значение -9,котрое затем печатается на экране. Процесс повторяется со списком [5,3].
В конце концов, когда переменная Head принимает значение 3, переменной Tail присваивается пустой список. Теперь при рекурсивном вызове print_list(Tail) значение Tail соответствует объекту правила print_list([])
Ввиду того, что этот вариант не имеет рекурсивных вызовов, цель считается удовлетворенной, и таким образом вырабатывается условие окончания рекурсии print_list.
Первый вариант позволяет print_list завершиться успехом, когда рекурсивные вызовы опустошат весь список.
Похожий процесс имеет место и при задании внешней цели:
print_list(["Жираф", "Обезьяна", "Слон", "Крокодил"]).
Программа «Голова-хвост списка» демонстрирует использования метода разделения списка на голову и хвост. Два списка описаны в ней: - список целых чисел (имя домена - number_list) - список символических имен (домен animal_list). Правило print_list применяется для доступа к элементам обоих списков.*/ domains number_list = integer * animal_list = symbol * predicates /* Так как предикат print_list опеределен для объектов обоих доменов, то это правило используется для работы как со списком number_list, так и списком animal_list. */ print_list(number_list) print_list(animal_list) clauses /* Правила для доступа к элементам списка */ /* Рекурсия print_list - выполнять разделение списка на голову и хвост пока не будет достигнут результат - хвост (Tail) - пустой элемент*/ print_list([]). print_list([Head|Tail]) :- write(Head),nl, print_list(Tail). goal /* Внешние цели */ /* print_list([4,-9,5,3]). /* print_list(["cat","dog","horse","cow"]). */
Результат (вводят внешние цели):
4
-9
5
3
cat
dog
horse
cow
!!Рекомендуем: Что должен знать современный человек? ⇒ Семейная Энциклопедия Здоровья ⇒ Самоанализ. Работа над собой ⇒ Оглавление ⇒ Главная сайта
Обсуждение