Предикат, преобразующий строку в список слов, состоящих из четного количества символов - Prolog

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

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

Создайте предикат, преобразующий строку в список слов, состоящих из четного количества символов.

Решение задачи: «Предикат, преобразующий строку в список слов, состоящих из четного количества символов»

textual
Листинг программы
  1. domains
  2.  
  3. str=string
  4. strl=str*
  5. int=integer
  6. intl=int*
  7.  
  8. predicates
  9.  
  10. instr(str,char,int,int)
  11. headstr(str,int,str)
  12. tailstr(str,int,str)
  13. split(str,strl)
  14. lens(str,int)
  15. filter(strl,strl)
  16. task(str,strl)
  17.  
  18. clauses
  19.  
  20. instr("",_,_,0).
  21. instr(S,C,N,N1) :- frontchar(S,C,_), N1=N+1, !.
  22. instr(S,C,N,K)  :- frontchar(S,_,RS), N1=N+1, instr(RS,C,N1,K).
  23.  
  24. headstr(_,0,"").
  25. headstr(S,L,R) :- frontchar(S,B,RS), L1=L-1, headstr(RS,L1,RR), frontchar(R,B,RR).
  26.  
  27. tailstr(S,0,S).
  28. tailstr(S,N,Q) :- frontchar(S,_,RS), N1=N-1, tailstr(RS,N1,Q).
  29.  
  30. split("",[]).
  31. split(S,[S])   :- instr(S,' ',0,K), K=0,!.
  32. split(S,[H|T]) :- instr(S,' ',0,K), K>1, K1=K-1, headstr(S,K1,H), tailstr(S,K,RS), split(RS,T).
  33. split(S,Q)     :- frontchar(S,' ',RS), split(RS,Q).
  34.  
  35. lens("",0).
  36. lens(S,L) :- frontchar(S,_,RS), lens(RS,L1), L=L1+1.
  37.  
  38. filter([],[]).
  39. filter([H|T],[H|R]) :- lens(H,L), (L mod 2)=0, filter(T,R).
  40. filter([H|T],R) :- lens(H,L), (L mod 2)<>0, filter(T,R).
  41.  
  42. task(S,R) :- split(S,LS), filter(LS,R).

Объяснение кода листинга программы

  1. Предикат instr(str,char,int,int) вероятно отвечает за поиск определенного символа в строке и возвращает индексы символа в строке и количество символов до и после него.
  2. Предикат headstr(str,int,str) вероятно отвечает за разделение строки на две части по определенному символу и индексу и возвращает голову строки (часть строки до разделителя) и индекс разделителя.
  3. Предикат tailstr(str,int,str) вероятно отвечает за разделение строки на две части по определенному символу и индексу и возвращает хвост строки (часть строки после разделителя) и индекс разделителя.
  4. Предикат split(str,strl) вероятно отвечает за разделение строки на список строк по определенному символу и возвращает список строк, полученных после разделения.
  5. Предикат lens(str,int) вероятно отвечает за подсчет количества символов в строке.
  6. Предикат filter(strl,strl) вероятно отвечает за фильтрацию списка строк таким образом, чтобы в итоге получился список строк, длина которых является четным числом.
  7. Предикат task(str,strl) вероятно является главным предикатом, который принимает на вход строку и список строк и выполняет задачу, описанную в постановке.

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


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

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

14   голосов , оценка 4.286 из 5

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

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

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