Даны число 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).

Объяснение кода листинга программы

В коде:

  1. Определены три домена: tree, int и intl.
  2. Определены три предиката: app, filter и tree2list.
  3. В предикате app определены три clause:
    • app([],X,X).
    • app([H|T],X,[H|Q]) :- app(T,X,Q).
  4. В предикате 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).
  5. В предикате tree2list определено два clause:
    • tree2list(no,[]).
    • tree2list(bt(V,L,R),Z) :- tree2list(L,ZL), tree2list(R,ZR), app(ZL,[V],T), app(T,ZR,Z). Код представляет собой реализацию обхода дерева в глубину с фильтрацией элементов по заданному диапазону. При этом, элементы дерева, удовлетворяющие условию, объединяются в список. Для этого, в коде определены следующие функции:
  6. app - объединяет два списка в один.
  7. filter - фильтрует элементы списка, удовлетворяющие условию.
  8. tree2list - преобразует дерево в список. Также, в коде используется домен intl, который представляет собой список целых чисел. Общая логика работы кода следующая:
  9. Сначала, с помощью функции tree2list, дерево преобразуется в список.
  10. Затем, с помощью функции filter, из списка удаляются элементы, не удовлетворяющие условию.
  11. Наконец, с помощью функции app, два списка объединяются в один. В итоге, код реализует обход дерева в глубину с фильтрацией элементов по заданному диапазону и объединение элементов дерева, удовлетворяющих условию, в список.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.375 из 5
Похожие ответы