Сборник задач по курсу «Логическое программирование»: Учебное пособие, страница 7

91.  Найти в дереве все пути от корня до его листьев, лежащих на максимальной глубине.

Аргументы: произвольное дерево; путь (список).

?- pred(a(f(a(m,k,v),r),n(i,o)),X). X = [a,f,a,m] -> ; X = [a,f,a,k] -> ; X = [a,f,a,v] -> ; no ?-

92.  Найти в дереве все поддеревья, имеющие глубину не больше заданной.

Аргументы: произвольное дерево; максимальная глубина; поддерево.

?- pred(a(f(a(m,k),r,v(g)),n(i,o)),2,X). X = a(m,k) -> ; X = m -> ; X = k -> ; X = r -> ; X = v(g) -> ; X = g -> ; X = n(i,o) -> ; X = i -> ; X = o -> ; no ?-

93.  Выполнить перебор листьев в порядке убывания их глубины.

Аргументы: произвольное дерево; лист дерева.

?- pred(a(f(a(m,k(v)),r),n(i(d,e,z),o)),X). X = v -> ; X = m -> ; X = k -> ; X = d -> ; X = e -> ; X = z -> ; X = r -> ; X = o -> ; no ?-

94.  Найти узел, имеющий максимальное количество потомков.

Аргументы: произвольное дерево; узел дерева.

?- pred(a(f(a(m,k(v)),r),n(i(d,e,z(q,w,t)),o)),X). X = i -> ; X = z -> ; no ?-

95.  Составить описание каждого узла дерева (потомки нумеруются слева направо).

Аргументы: произвольное дерево; описание узла (атом).

?- pred(a(f(a(m,k(v)),r),n(i(d,e,z)),o),X). X = a -> ; X = 1:f -> ; X = 1:1:a -> ; X = 1:1:1:m -> ; X = 1:1:2:k -> ; X = 1:1:2:1:v -> ; X = 1:2:r -> ; X = 2:n -> ; X = 2:1:i -> ; X = 2:1:1:d -> ; X = 2:1:2:e -> ; X = 2:1:3:z -> ; X = 3:o -> ; no ?-

96.  Дана строка, которая с помощью предиката string_term/2 (см. пример) корректно преобразуется в терм. Предполагается, что строка может преобразовываться в структуру любой арности, содержащую свободные переменные. Собрать из исходной строки в список имена свободных переменных.

Аргументы: исходная строка; список имен переменных.

?- string_term(’r(T,m(T,K))’,B). B = r(_70,m(_70,_84)) yes ?- pred(’r(T,m(T,K))’,X). X = [’T’,’K’] yes ?-

97.  Сформировать графическое представление дерева в виде строки, используя символы псевдографики (см. приложение В).

Аргументы: произвольное дерево; строка.

?- pred(a(f(a(m,k(v)),r),n(i(d,e,z)),o),X). X = a ├─f │ ├─a │ │ ├─m │ │ └─k │ │   └─v │ └─r ├─n │ └─i │   ├─d │   ├─e │   └─z └─o yes ?-


Файлы и разделы базы данных

98.  Если нумеровать потомков каждого узла дерева слева направо, то можно для каждого узла составить его описание (см. при-мер). В разделе БД хранится терм представленный в виде совокупности описаний узлов. Преобразовать описание в структуру Пролога.

Аргументы: имя раздела БД (имя структуры); структура.

?- recorded(tst,X,_). X = 1:f -> ; X = 1:1:a -> ; X = 1:1:1:m -> ; X = 1:1:2:k -> ; X = 1:1:2:1:v -> ; X = 1:2:r -> ; X = 2:n -> ; X = 2:1:i -> ; X = 2:1:1:d -> ; X = 2:1:2:e -> ; X = 2:1:3:z -> ; X = 3:o -> ; no ?- pred(tst,X). X = tst(f(a(m,k(v)),r),n(i(d,e,z)),o) yes ?-

99.  Растровое изображение хранится в дисковом файле формата PPM (см. приложение В). Построить зеркальное отражение исходного изображения. Результат сохранить в новом файле.

Аргументы: имя исходного файла; имя нового файла.

?- pred(’sample.ppm’,’new.ppm’). yes ?-

100.  В разделе БД хранится терм  в графическом представлении. Преобразовать его в структуру Пролога. Символы псевдографики см. в приложении В.

Аргументы: имя раздела БД; структура.

?- recorded(test,X,_). X = a -> ; X = ├─f -> ; X = │ ├─a -> ; X = │ │ ├─m -> ; X = │ │ └─k -> ; X = │ │   └─v -> ; X = │ └─r -> ; X = ├─n -> ; X = │ └─i -> ; X = │   ├─d -> ; X = │   ├─e -> ; X = │   └─z -> ; X = └─o -> ; no ?- pred(test,X). X = a(f(a(m,k(v)),r),n(i(d,e,z)),o) yes ?-

101.  Растровое изображение, хранится в дисковом файле формата PPM (см. приложение В). Преобразовать исходное цветное изображение в черно-белое (в градациях серого). Результат сохранить в новом файле. Для пересчета цветовых координат пикселя (R,G, B) к яркости можно воспользоваться формулой L = 0.3R + 0.59G + 0.11B.

Аргументы: имя исходного файла; имя нового файла.

?- pred(’sample.ppm’,’new.ppm’). yes ?-