Проверить эквивалентность двух списков - Prolog
Формулировка задачи:
Здравствуйте! У меня изначально был написан такой алгоритм:
И все работало нормально. Но после встраивания в программу меню и добавления предиката для ввода списка, все как-то начало падать при вводе разных список. В чем проблема?
Ошибка исправлена, помощь больше не требуется
Решение задачи: «Проверить эквивалентность двух списков»
textual
Листинг программы
domains int=integer intl=int* predicates equal(intl,intl) clauses equal([],[]). equal([_],[]) :- fail. equal([],[_]) :- fail. equal([X|T1],[X|T2]) :- equal(T1,T2). equal([X|_],[Y|_]) :- X<>Y, fail.
Объяснение кода листинга программы
domains- определение типов данных для переменных. В данном случае,intэто целочисленный тип данных, аintlэто указатель на массив целочисленных значений.predicates- определение пользовательских предикатов. В данном случае,equalэто предикат, который проверяет эквивалентность двух списков.clauses- определение правил (условий) для предикатаequal. Первое правило говорит, что если оба списка пустые, то они эквивалентны. Второе и третье правила указывают на неравенство, если списки не пустые и если первый список пустой, а второй не пустой и наоборот. Четвертое правило говорит, что если первые элементы списков не равны, то списки не эквивалентны.equal([],[]).- первое правило вclauses, которое говорит, что если оба списка пустые, то они эквивалентны.equal([_],[]) :- fail.- второе правило вclauses, которое указывает на неравенство, если первый список не пустой.equal([],[_]) :- fail.- третье правило вclauses, которое указывает на неравенство, если второй список не пустой.equal([X|T1],[X|T2]) :- equal(T1,T2).- четвертое правило вclauses, которое рекурсивно вызывает предикатequalдля оставшейся части списков.equal([X|_],[Y|_]) :- X<>Y, fail.- пятое правило вclauses, которое указывает на неравенство, если первые элементы списков не равны.