Оставить в списке элементы, которые имеют парное количество вхождений в список - 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).

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

  1. Задача: реализовать логическое программирование на языке Prolog для получения списка, содержащего только элементы, которые встречаются в исходном списке с четным количеством.
  2. Используемые области определения (domains):
    • int (целое число)
    • intl (упорядоченный список целых чисел)
    • intll (упорядорованный список целых списков)
  3. Используемые предикаты (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 (результат)
  4. Реализация:
    • 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, содержащий только элементы, которые встречаются с четным количеством.

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


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

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

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