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