Список чисел, встречающихся в двух списках одинаковое число раз - Prolog

Узнай цену своей работы

Формулировка задачи:

Даны два непустых списка целых чисел L1 и L2. Создать программу, которая строит список L3, содержащий (без повторений) все числа, одинаковое количество раз встречающиеся в L1 и L2. Запрос: R(L1, L2, L3). Помогите пожалуйста, не знаю как решить...

Решение задачи: «Список чисел, встречающихся в двух списках одинаковое число раз»

textual
Листинг программы
domains 
int=integer
intl=int*
 
predicates
delall(int,intl,intl)
len(intl,int) 
freq(int,intl,int)
cmp(int,intl,intl)
mkl(intl,intl,intl,intl)
memb(int,intl)
inters(intl,intl,intl)
task(intl,intl,intl)
 
clauses
delall(_,[],[]).
delall(X,[X|T],Z) :- delall(X,T,Z).
delall(X,[Y|T],[Y|Z]) :- X<>Y,delall(X,T,Z).
 
len([],0).
len([_|T],N) :- len(T,N1), N=N1+1.
 
freq(X,Z,N) :- delall(X,Z,XX), len(XX,L1), len(Z,L0), N=L0-L1.
 
cmp(A,X,Y) :- freq(A,X,N1), freq(A,Y,N2), N1=N2.
 
memb(_,[]) :- fail.
memb(X,[X|_]).
memb(X,[Y|T]) :- X<>Y, memb(X,T).
 
inters([],_,[]).
inters([X|T],Y,[X|R]) :- memb(X,Y), delall(X,Y,YY), delall(X,T,TT), inters(TT,YY,R).
inters([X|T],Y,R) :- not(memb(X,Y)), delall(X,T,TT), inters(TT,Y,R).
 
mkl([],_,_,[]).
mkl([H|XY],X,Y,[H|R]) :- cmp(H,X,Y), mkl(XY,X,Y,R).
mkl([H|XY],X,Y,R) :- not(cmp(H,X,Y)), mkl(XY,X,Y,R). 
 
task(X,Y,R) :- inters(X,Y,XY), mkl(XY,X,Y,R).

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


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

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

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