Список чисел, встречающихся в двух списках одинаковое число раз - 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).
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д