Предикат, проверяющий, является ли данная строка палиндромом - 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.
- если строка пуста, то вызывается провал.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д