Оставить в списке элементы, которые имеют парное количество вхождений в список - Prolog
Формулировка задачи:
Например есть список [1,2,2,3,3,3,4,4,4,4]. Результат: [2,2,4,4,4,4]
Решение задачи: «Оставить в списке элементы, которые имеют парное количество вхождений в список»
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,N]|R],[X|T]) :- N mod 2 = 0, mklist(R,T). mklist([[_,N]|R],T) :- N mod 2 = 1, mklist(R,T). task(X,R) :- mkpair(X,XX), mklist(XX,R).
Объяснение кода листинга программы
- Задача: реализовать логическое программирование на языке Prolog для получения списка, содержащего только элементы, которые встречаются в исходном списке с четным количеством.
- Используемые области определения (domains):
- int (целое число)
- intl (упорядоченный список целых чисел)
- intll (упорядорованный список целых списков)
- Используемые предикаты (predicates):
- len(intl,int) - принимает два аргумента: intl (исходный список) и int (счетчик, который увеличивается на 1 для каждого элемента в списке)
- del(intl,int,intl) - принимает три аргумента: intl (исходный список), int (элемент, который нужно удалить из списка), intl (очищенный список)
- mkpair(intl,intll) - принимает два аргумента: intl (исходный список), intll (результат, содержащий пары элементов исходного списка)
- mklist(intll,intl) - принимает два аргумента: intll (список пар), intl (результат, содержащий только элементы, которые встречаются с четным количеством)
- task(intl,intl) - принимает два аргумента: intl (исходный список), intl (результат)
- Реализация:
- len([],0). - пустой список имеет длину 0
- len([_|T],N) :- len(T,N1), N=N1+1. - для каждого элемента в списке T добавляется 1 к счетчику N
- del([],_,[]). - если исходный список пуст, то результат также будет пуст
- del([X|T],X,R) :- del(T,X,R). - для каждого элемента X в списке T результат будет R (очищенный список без X)
- del([H|T],X,[H|R]) :- H<>X, del(T,X,R). - если H не равно X, то результат будет R (очищенный список без 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). - для каждого элемента H в списке T создается пара [H,N], где N - количество элементов в списке T, исключая H
- mklist([],[]). - пустой исходный список не содержит пар
- mklist([[X,N]|R],[X|T]) :- N mod 2 = 0, mklist(R,T). - если N (количество элементов в паре) делится на 2 без остатка, то результат будет T (список, содержащий только четные пары)
- mklist([[_,N]|R],T) :- N mod 2 = 1, mklist(R,T). - если N (количество элементов в паре) не делится на 2 без остатка, то результат будет T (список, содержащий только нечетные пары)
- task(X,R) :- mkpair(X,XX), mklist(XX,R). - задача решается путем создания пар в XX, а затем фильтрации списка пар для получения только четных или нечетных пар
- В результате выполнения задачи, список исходного списка X будет преобразован в список R, содержащий только элементы, которые встречаются с четным количеством.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д