Выяснить, сколько чисел входит в список более, чем по одному разу - Prolog

Узнай цену своей работы

Формулировка задачи:

есть такая программа она рассчитывает сколько чисел входит 1 раз.
Листинг программы
  1. domains n=integer*
  2. predicates
  3. po_1_razy(integer,integer,n,n)
  4. poisk(integer,n,integer,integer)
  5. clauses
  6. poisk(_,[],C,C):-!.
  7. poisk(X,[X1|Z],A,C):-X=X1, A1=A+1, poisk(X,Z,A1,C);
  8. X<>X1, poisk(X,Z,A,C).
  9. po_1_razy(N,N,[],_):-!.
  10. 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);
  11. po_1_razy(N,M,X,Z1).
  12. goal
  13. X=[1,2,2,5,3,4], po_1_razy(N,0,X,X),write(N).
задание : выяснить сколько чисел входит в исходный список более, чем по одному разу.

Решение задачи: «Выяснить, сколько чисел входит в список более, чем по одному разу»

textual
Листинг программы
  1. domains
  2. int=integer
  3. intl=int*
  4.  
  5. predicates
  6. del_all(int,intl,intl)
  7. is_in(int,intl)
  8. task(intl,int)
  9.  
  10. clauses
  11. is_in(_,[]) :- fail.
  12. is_in(H,[H|_]).
  13. is_in(H,[Q|T]) :- Q<>H, is_in(H,T).
  14.  
  15. del_all(_,[],[]).
  16. del_all(H,[H|T],R) :- del_all(H,T,R).
  17. del_all(H,[Q|T],[Q|R]) :- H<>Q, del_all(H,T,R).
  18.  
  19. task([],0).
  20. task([H|T],N) :- is_in(H,T), del_all(H,T,T1), task(T1,N1), N=N1+1.
  21. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы