Предикат, проверяющий, является ли данная строка палиндромом - Prolog
Формулировка задачи:
Создайте предикат, проверяющий, является ли данная строка палиндромом
Решение задачи: «Предикат, проверяющий, является ли данная строка палиндромом»
textual
Листинг программы
predicates
strlen(string,integer)
lastchar(string,char)
init(string,string)
ispal(string)
clauses
strlen("",0).
strlen(S,N) :- frontchar(S,_,RS), strlen(RS,N1), N=N1+1.
lastchar(S,C) :- strlen(S,1), frontchar(S,C,"").
lastchar(S,C) :- strlen(S,L),L>1, frontchar(S,_,RS), lastchar(RS,C).
init(S,"") :- strlen(S,1).
init(S,R) :- frontchar(S,B,RS),init(RS,Q), frontchar(R,B,Q).
ispal(S) :- strlen(S,L), L<=1.
ispal(S) :- frontchar(S,B,RS), lastchar(RS,E), B=E, init(RS,Q), ispal(Q).
ispal(_) :- fail.
Объяснение кода листинга программы
- В данном коде реализованы четыре предиката:
strlen(string,integer)- принимает два аргумента типаstringиinteger. Первый аргумент - строка, второй - число. Данный предикат вычисляет длину строки.lastchar(string,char)- принимает два аргумента типаstringиchar. Первый аргумент - строка, второй - последний символ строки. Если строка пустая, то возвращается пустой символ. Если в строке больше одного символа, то рекурсивно вызывается предикатlastcharдля оставшейся части строки.init(string,string)- принимает два аргумента типаstring. Первый аргумент - строка, второй - инициализируемая строка. Если первый аргумент пуст, то возвращается второй. Если первый аргумент не пуст, то рекурсивно вызывается предикатinitдля оставшейся части строки.ispal(string)- принимает один аргумент типаstring. Проверяет, является ли строка палиндромом. Если длина строки меньше или равна 1, то возвращаетсяtrue. Если первый символ не равен последнему, то возвращаетсяfalse. Если первый символ равен последнему, то рекурсивно вызывается предикатispalдля оставшейся части строки.
- В данном коде реализованы четыре правила (clauses):
strlen(``,0).- инициализирует переменнуюNравной 0 для пустой строки.strlen(S,N) :- frontchar(S,_,RS), strlen(RS,N1), N=N1+1.- рекурсивно вызывает предикатstrlenдля оставшейся части строкиRSи увеличивает значение переменнойNна 1.lastchar(S,C) :- strlen(S,1), frontchar(S,C,``).- если длина строки равна 1, то возвращается последний символ строки. Если длина строки больше 1, то рекурсивно вызывается предикатlastcharдля оставшейся части строки.init(S,``) :- strlen(S,1).- если длина строки равна 1, то возвращается пустая строка.init(S,R) :- frontchar(S,B,RS),init(RS,Q), frontchar(R,B,Q).- рекурсивно вызывает предикатinitдля оставшейся части строкиRSи переносит первый символBв начало результирующей строкиQ.ispal(S) :- strlen(S,L), L<=1.- если длина строки меньше или равна 1, то возвращаетсяtrue.ispal(S) :- frontchar(S,B,RS), lastchar(RS,E), B=E, init(RS,Q), ispal(Q).- рекурсивно вызывает предикатispalдля оставшейся части строкиRS. Если первый символ не равен последнему, то предикат вызывается рекурсивно для оставшейся части строкиQ.ispal(_) :- fail.- если строка пуста, то вызывается провал.