Даны число N, число M и список - Prolog
Формулировка задачи:
Составить программу, считывающую из файла "input.txt" две строки текста, в которых записаны ис-
ходные данные для 2-х заданий. Если в задаче данные не требуются, строка будет пустой, т.е. состоять
только из символа перевода строки. Программа записывает в файл "output.txt" результат вычисления
каждой задачи так же, в 2-х
Задача:
Даны число N, число M и список, элементы которого — непустые бинарные деревья с числами в качестве вершин. Для каждого такого дерева найти число вершин, значения которых лежат в диапазоне от N до M включительно. Из полученных результатов сформировать список и вывести его. Затем через пробел вывести его копию, в которой удалены 2-ой, 4-ый и т.д. элементы.
Например: если дано "1 5 [bt(5,bt(9,no,no),bt(3,bt(7,no,no),no)),bt(3,bt(4,no,no),bt(2,no,no)), bt(9,no,no),bt(2,no,no)]", ответом будет "[2,3,0,1] [2,0]".
Решение задачи: «Даны число N, число M и список»
textual
Листинг программы
domains tree = bt(integer, tree, tree); no int=integer intl=int* predicates app(intl,intl,intl) %% сцепить два списка filter(intl,int,int,intl) %% отфильтровать из списка числа, принадлежащме диапазону [N,M] tree2list(tree,intl) %% преобразовать дерево в список clauses app([],X,X). app([H|T],X,[H|Q]) :- app(T,X,Q). filter([],_,_,[]). filter([H|T],N,M,[H|Q]) :- H>=N, H<=M, filter(T,N,M,Q). filter([H|T],N,M,Q) :- H>M, filter(T,N,M,Q). filter([H|T],N,M,Q) :- H<N, filter(T,N,M,Q). tree2list(no,[]). tree2list(bt(V,L,R),Z) :- tree2list(L,ZL), tree2list(R,ZR), app(ZL,[V],T), app(T,ZR,Z).
Объяснение кода листинга программы
В коде:
- Определены три домена:
tree,intиintl. - Определены три предиката:
app,filterиtree2list. - В предикате
appопределены три clause:app([],X,X).app([H|T],X,[H|Q]) :- app(T,X,Q).
- В предикате
filterопределены четыре clause:filter([],_,_,[]).filter([H|T],N,M,[H|Q]) :- H>=N, H<=M, filter(T,N,M,Q).filter([H|T],N,M,Q) :- H>M, filter(T,N,M,Q).filter([H|T],N,M,Q) :- H<N, filter(T,N,M,Q).
- В предикате
tree2listопределено два clause:tree2list(no,[]).tree2list(bt(V,L,R),Z) :- tree2list(L,ZL), tree2list(R,ZR), app(ZL,[V],T), app(T,ZR,Z).Код представляет собой реализацию обхода дерева в глубину с фильтрацией элементов по заданному диапазону. При этом, элементы дерева, удовлетворяющие условию, объединяются в список. Для этого, в коде определены следующие функции:
app- объединяет два списка в один.filter- фильтрует элементы списка, удовлетворяющие условию.tree2list- преобразует дерево в список. Также, в коде используется доменintl, который представляет собой список целых чисел. Общая логика работы кода следующая:- Сначала, с помощью функции
tree2list, дерево преобразуется в список. - Затем, с помощью функции
filter, из списка удаляются элементы, не удовлетворяющие условию. - Наконец, с помощью функции
app, два списка объединяются в один. В итоге, код реализует обход дерева в глубину с фильтрацией элементов по заданному диапазону и объединение элементов дерева, удовлетворяющих условию, в список.