Выяснить, сколько чисел входит в список более, чем по одному разу - Prolog
Формулировка задачи:
есть такая программа она рассчитывает сколько чисел входит 1 раз.
задание : выяснить сколько чисел входит в исходный список более, чем по одному разу.
Листинг программы
- domains n=integer*
- predicates
- po_1_razy(integer,integer,n,n)
- poisk(integer,n,integer,integer)
- clauses
- poisk(_,[],C,C):-!.
- poisk(X,[X1|Z],A,C):-X=X1, A1=A+1, poisk(X,Z,A1,C);
- X<>X1, poisk(X,Z,A,C).
- po_1_razy(N,N,[],_):-!.
- po_1_razy(N,M,[X1|X],Z1):-poisk(X1,Z1,0,A), A=1, M1=M+1, po_1_razy(N,M1,X,Z1);
- po_1_razy(N,M,X,Z1).
- goal
- X=[1,2,2,5,3,4], po_1_razy(N,0,X,X),write(N).
Решение задачи: «Выяснить, сколько чисел входит в список более, чем по одному разу»
textual
Листинг программы
- domains
- int=integer
- intl=int*
- predicates
- del_all(int,intl,intl)
- is_in(int,intl)
- task(intl,int)
- clauses
- is_in(_,[]) :- fail.
- is_in(H,[H|_]).
- is_in(H,[Q|T]) :- Q<>H, is_in(H,T).
- del_all(_,[],[]).
- del_all(H,[H|T],R) :- del_all(H,T,R).
- del_all(H,[Q|T],[Q|R]) :- H<>Q, del_all(H,T,R).
- task([],0).
- task([H|T],N) :- is_in(H,T), del_all(H,T,T1), task(T1,N1), N=N1+1.
- task([H|T],N) :- not(is_in(H,T)), del_all(H,T,T1), task(T1,N).
Объяснение кода листинга программы
В коде используется язык программирования Prolog.
- В первой строке объявляются три переменные:
int
- целочисленное значение,intl
- список целых чисел,task
- номер задачи.
- Далее идут три предиката:
del_all
- удаляет все вхождения числа из списка,is_in
- проверяет наличие числа в списке,task
- основная задача.
- Первое утверждение в блоке
clauses
говорит, что если число отсутствует в списке, то оно не найдено (is_in(_,[]) :- fail.
). - Второе утверждение говорит, что если число есть в списке, то оно находится в голове списка (
is_in(H,[H|_]).
). - Третье утверждение говорит, что если число есть в списке, то оно может быть удалено (
is_in(H,[Q|T]) :- Q<>H, is_in(H,T).
). - Первое утверждение в блоке
del_all
говорит, что если список пустой, то он остаётся пустым после удаления (del_all(_,[],[]).
). - Второе утверждение говорит, что если число есть в списке, то после его удаления список становится меньше на один элемент (
del_all(H,[H|T],R) :- del_all(H,T,R).
). - Третье утверждение говорит, что если число не равно голове списка, то оно может быть удалено (
del_all(H,[Q|T],[Q|R]) :- H<>Q, del_all(H,T,R).
). - Первое утверждение в блоке
task
говорит, что если список пустой, то количество выполненных задач равно нулю (task([],0).
). - Второе утверждение говорит, что если число есть в списке, то после его удаления количество выполненных задач увеличивается на единицу (
task([H|T],N) :- is_in(H,T), del_all(H,T,T1), task(T1,N1), N=N1+1.
). - Третье утверждение говорит, что если число отсутствует в списке, то количество выполненных задач не изменяется (
task([H|T],N) :- not(is_in(H,T)), del_all(H,T,T1), task(T1,N).
).
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д