Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- getNth([R|_],A,A,R). % получение N-го элемента списка
- getNth([_|T],A,X,R) :- A1 is A + 1, getNth(T,A1,X,R).
- getLength([], 0). % получение количества элементов в списке
- getLength([H|T], C) :- getLength(T, C1), C is C1 + 1.
- testPoly(X) :- string_to_list(X, F),testPolyList(F). % перевод строки в список символов с помощью стандартной процедуры. например, "TEST" => [84, 69, 83, 84]. Вызов testPolyList, которая работает со строкой как со списком символов
- testPolyList(X) :- getLength(X, L), E is 0, C is 1, testPolyList(X, C, L, E, X, X). % в случае если вызов идет с одним аргументом (списком символов), установить начальные значения: L (N) = кол-во символов, E = 0 (кол-во найденных различий), C = 1 (номер текущего проверяемого символа).
- testPolyList(X, C, N, E, Z1, Z2) :- getNth(Z1, 1, C, EL1), S is ((N-C)+1), getNth(Z2, 1, S, EL2),(EL1=\=EL2 -> E1 is E + 1 ; E1 is E),
- C1 is C + 1,(C < N -> testPolyList(X, C1, N, E1, X, X) ; (E1=:=0 -> write('Палиндром') ; (E1=:=2 -> write('Почти палиндром') ; write('Не палиндром')))). % Основные вызовы идут с 6 аргументами. "X" Список, "C" номер текущего символа, "N" кол-во символов, "E" кол-во различий, "Z1" исх. список, "Z2" исх. список. В конце дважды исходный список для каждого вызова getNth, чтобы эта процедура не изменяла исходный. На каждом шаге получаем C-ый и N-C+1 (например: 1 и 5-ый, 2 и 4-й и т.д., в конце 5-ый и 1-ый) элемент, сравниваем их как числа, если не равны, увеличиваем счетчик различий E. Обходим весь представленный список, после чего делается вывод: если различий 0 - палиндром, если 2 - отличается на одну букву - почти палиндром, если другой вариант - не палиндром.
Advertisement