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

  1. В первой строке объявляются три переменные:
    • int - целочисленное значение,
    • intl - список целых чисел,
    • task - номер задачи.
  2. Далее идут три предиката:
    • del_all - удаляет все вхождения числа из списка,
    • is_in - проверяет наличие числа в списке,
    • task - основная задача.
  3. Первое утверждение в блоке clauses говорит, что если число отсутствует в списке, то оно не найдено (is_in(_,[]) :- fail.).
  4. Второе утверждение говорит, что если число есть в списке, то оно находится в голове списка (is_in(H,[H|_]).).
  5. Третье утверждение говорит, что если число есть в списке, то оно может быть удалено (is_in(H,[Q|T]) :- Q<>H, is_in(H,T).).
  6. Первое утверждение в блоке del_all говорит, что если список пустой, то он остаётся пустым после удаления (del_all(_,[],[]).).
  7. Второе утверждение говорит, что если число есть в списке, то после его удаления список становится меньше на один элемент (del_all(H,[H|T],R) :- del_all(H,T,R).).
  8. Третье утверждение говорит, что если число не равно голове списка, то оно может быть удалено (del_all(H,[Q|T],[Q|R]) :- H<>Q, del_all(H,T,R).).
  9. Первое утверждение в блоке task говорит, что если список пустой, то количество выполненных задач равно нулю (task([],0).).
  10. Второе утверждение говорит, что если число есть в списке, то после его удаления количество выполненных задач увеличивается на единицу (task([H|T],N) :- is_in(H,T), del_all(H,T,T1), task(T1,N1), N=N1+1.).
  11. Третье утверждение говорит, что если число отсутствует в списке, то количество выполненных задач не изменяется (task([H|T],N) :- not(is_in(H,T)), del_all(H,T,T1), task(T1,N).).

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


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

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

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