Предикат, преобразующий строку в список слов, состоящих из четного количества символов - Prolog
Формулировка задачи:
Создайте предикат, преобразующий строку в список слов, состоящих из четного количества символов.
Решение задачи: «Предикат, преобразующий строку в список слов, состоящих из четного количества символов»
textual
Листинг программы
domains str=string strl=str* int=integer intl=int* predicates instr(str,char,int,int) headstr(str,int,str) tailstr(str,int,str) split(str,strl) lens(str,int) filter(strl,strl) task(str,strl) clauses instr("",_,_,0). instr(S,C,N,N1) :- frontchar(S,C,_), N1=N+1, !. instr(S,C,N,K) :- frontchar(S,_,RS), N1=N+1, instr(RS,C,N1,K). headstr(_,0,""). headstr(S,L,R) :- frontchar(S,B,RS), L1=L-1, headstr(RS,L1,RR), frontchar(R,B,RR). tailstr(S,0,S). tailstr(S,N,Q) :- frontchar(S,_,RS), N1=N-1, tailstr(RS,N1,Q). split("",[]). split(S,[S]) :- instr(S,' ',0,K), K=0,!. split(S,[H|T]) :- instr(S,' ',0,K), K>1, K1=K-1, headstr(S,K1,H), tailstr(S,K,RS), split(RS,T). split(S,Q) :- frontchar(S,' ',RS), split(RS,Q). lens("",0). lens(S,L) :- frontchar(S,_,RS), lens(RS,L1), L=L1+1. filter([],[]). filter([H|T],[H|R]) :- lens(H,L), (L mod 2)=0, filter(T,R). filter([H|T],R) :- lens(H,L), (L mod 2)<>0, filter(T,R). task(S,R) :- split(S,LS), filter(LS,R).
Объяснение кода листинга программы
- Предикат
instr(str,char,int,int)
вероятно отвечает за поиск определенного символа в строке и возвращает индексы символа в строке и количество символов до и после него. - Предикат
headstr(str,int,str)
вероятно отвечает за разделение строки на две части по определенному символу и индексу и возвращает голову строки (часть строки до разделителя) и индекс разделителя. - Предикат
tailstr(str,int,str)
вероятно отвечает за разделение строки на две части по определенному символу и индексу и возвращает хвост строки (часть строки после разделителя) и индекс разделителя. - Предикат
split(str,strl)
вероятно отвечает за разделение строки на список строк по определенному символу и возвращает список строк, полученных после разделения. - Предикат
lens(str,int)
вероятно отвечает за подсчет количества символов в строке. - Предикат
filter(strl,strl)
вероятно отвечает за фильтрацию списка строк таким образом, чтобы в итоге получился список строк, длина которых является четным числом. - Предикат
task(str,strl)
вероятно является главным предикатом, который принимает на вход строку и список строк и выполняет задачу, описанную в постановке.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д