Лабораторная работа «Списки»
Тема: работа со списками.
Цель работы: изучить основные принципы работы со списками в Visual Prolog.
Списки
Предположим, вы хотите заполнить расписание занятий по различным предметам, которые могут проводить разные преподаватели. Вы можете написать следующую программу:
predicates
teacher(symbol First_name, symbol Last_name, symbol Class) % учитель (имя,
фамилия, класс)
clauses
teacher(ed, willis, englishl). teacher(ed, willis, mathl). teacherfed, willis, historyl). teacher(тагу, maker, history2). teacher(тагу, maker, math2). teacher(chris, grahm, geometry).
Здесь повторяется имя учителя для каждого предмета, который он или она ведет. Для каждого предмета приходится добавлять факт к базе данных. Хотя это и совершенно правильно в такой ситуации, но можно найти школу, где преподают сотни предметов; такой тип данных становится слишком сложным. Здесь было бы удобно создать аргумент для предиката, который содержит одно или несколько значений.
Список в Прологе предлагает упростить решение данной задачи. В следующей программе аргумент class (класс) имеет тип "список". Мы покажем здесь, как список представляется в Прологе, а предикаты, работающие со списками.
domains
classes = symbol* % объявляем домен-список
predicates
teacher(symbol First, symbol Last, classes Classes) %( имя, фамилия, предметы)
clauses
teacher(ed, willis, [englishl, mathl, historyl]). teacher(тагу, maker, [history2, math2]). teacher(chris, grahm, [geometry]).
В этом примере текст программы более краток и понятен, чем в предыдущем. Обратите внимание на определение домена:
domains
classes = symbol*
Звездочка (*) обозначает, что classes — это список идентификаторов. Так же просто можно объявить список целых:
domains
integer_list = integer*
После того, как домен определен, его очень просто использовать; поместите его в качестве аргумента в предикат в разделе predicates. Ниже приведен пример использования списка целых:
domains
integer_list = integer*
predicates
test_scores(symbol First, symbol Last, integer_list Test_Scores) /* список_результатов (имя, фамилия, список_результатов */
clauses
test_scores(lisa, lavender, [86, 91, 75]).
test_scores(libby, dazzner, [79, 75]).
test_scores(jeff, zheutlin, []).
В случае Jeff zheutlin обратите внимание, что список может вообще не иметь элементов.