Даны число 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
, два списка объединяются в один. В итоге, код реализует обход дерева в глубину с фильтрацией элементов по заданному диапазону и объединение элементов дерева, удовлетворяющих условию, в список.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д