Оставить в первом списке элементы, которые входят во второй список только один раз - Prolog
Формулировка задачи:
Есть 2 списка. Оставить в первом только те элементы, которые есть во втором только в одном экземпляре.
Решение задачи: «Оставить в первом списке элементы, которые входят во второй список только один раз»
textual
Листинг программы
domains int=integer intl=int* intll=intl* predicates len(intl,int) del(intl,int,intl) mkpair(intl,intll) mklist(intll,intl) task(intl,intl) clauses len([],0). len([_|T],N) :- len(T,N1), N=N1+1. del([],_,[]). del([X|T],X,R) :- del(T,X,R). del([H|T],X,[H|R]) :- H<>X, del(T,X,R). mkpair([],[]). mkpair([H|T],[[H,N]|R]):- del(T,H,TD), len(T,L0), len(TD,L), N=L0-L+1, mkpair(TD,R). mklist([],[]). mklist([[X,1]|R],[X|T]) :- mklist(R,T). mklist([[_,N]|R],T) :- N>1, mklist(R,T). task(X,R) :- mkpair(X,XX), mklist(XX,R).
Объяснение кода листинга программы
- Первый пролог-файл (domains и predicates) описывает пространство имен и набор предикатов для работы с списками.
- Второй пролог-файл (clauses и tasks) содержит правила работы с этими списками.
- В функции len([],0) определяется длина пустого списка равная 0.
- Функция len([_|T],N) рекурсивно вызывает функцию len(T,N1), увеличивая значение N на единицу.
- Функция del([],_,[]) определяет удаление элемента из пустого списка как пустой список.
- Функция del([X|T],X,R) рекурсивно вызывает функцию del(T,X,R).
- Функция del([H|T],X,[H|R]) рекурсивно вызывает функцию del(T,X,R), если элемент H не равен X.
- Функция mkpair([],[]) определяет пустой список пар как пустой список.
- Функция mkpair([H|T],[[H,N]|R]):- del(T,H,TD), len(T,L0), len(TD,L), N=L0-L+1, mkpair(TD,R). рекурсивно вызывает функцию del для создания списка пар без элемента H.
- Функция mklist([],[]) определяет пустой список как пустой список.
- Функция mklist([[X,1]|R],[X|T]) :- mklist(R,T). рекурсивно вызывает функцию mklist для каждого элемента списка, кроме последнего.
- Функция mklist([[_,N]|R],T) :- N>1, mklist(R,T). рекурсивно вызывает функцию mklist для каждого элемента списка, если длина элемента больше одного.
- Функция task(X,R) :- mkpair(X,XX), mklist(XX,R). рекурсивно вызывает функции mkpair и mklist для решения задачи.
- Код выполняет следующие действия:
- Создает список пар без повторяющихся элементов (удаляет дубликаты).
- Создает список из элементов первого списка, которые встречаются более одного раза.
- Решение задачи выполняется путем рекурсивного вызова функций del, len, mkpair и mklist.
- Код может быть использован для удаления повторяющихся элементов из первого списка и создания списка из уникальных элементов.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д