Выяснить, сколько чисел входит в список более, чем по одному разу - Prolog
Формулировка задачи:
есть такая программа она рассчитывает сколько чисел входит 1 раз.
задание : выяснить сколько чисел входит в исходный список более, чем по одному разу.
Решение задачи: «Выяснить, сколько чисел входит в список более, чем по одному разу»
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).).