Предикат, проверяющий, является ли данная строка палиндромом - 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.

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

  1. В данном коде реализованы четыре предиката:
    • strlen(string,integer) - принимает два аргумента типа string и integer. Первый аргумент - строка, второй - число. Данный предикат вычисляет длину строки.
    • lastchar(string,char) - принимает два аргумента типа string и char. Первый аргумент - строка, второй - последний символ строки. Если строка пустая, то возвращается пустой символ. Если в строке больше одного символа, то рекурсивно вызывается предикат lastchar для оставшейся части строки.
    • init(string,string) - принимает два аргумента типа string. Первый аргумент - строка, второй - инициализируемая строка. Если первый аргумент пуст, то возвращается второй. Если первый аргумент не пуст, то рекурсивно вызывается предикат init для оставшейся части строки.
    • ispal(string) - принимает один аргумент типа string. Проверяет, является ли строка палиндромом. Если длина строки меньше или равна 1, то возвращается true. Если первый символ не равен последнему, то возвращается false. Если первый символ равен последнему, то рекурсивно вызывается предикат ispal для оставшейся части строки.
  2. В данном коде реализованы четыре правила (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. - если строка пуста, то вызывается провал.

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


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

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

10   голосов , оценка 3.9 из 5
Похожие ответы