Проверить эквивалентность двух списков - Prolog
Формулировка задачи:
Здравствуйте! У меня изначально был написан такой алгоритм:
И все работало нормально. Но после встраивания в программу меню и добавления предиката для ввода списка, все как-то начало падать при вводе разных список. В чем проблема?
Листинг программы
- domains
- i = integer
- list = i*
- predicates
- nondeterm equal(list, list)
- clauses
- equal([], []):- true,!.
- equal([X|T1],[X|T2]):- equal(T1,T2).
- equal([X|_],[Y|_]):- fail, !.
- goal
- equal ([0,0,0], [0,0]).
Листинг программы
- domains
- i = integer
- list = i*
- predicates
- nondeterm equal(list, list, i)
- nondeterm menu (i, list, list)
- nondeterm menu0
- readListItem(list)
- readList(list)
- clauses
- readListItem([H|T]):- readint(X), X <> ' ', !, H = X, readListItem(T).
- readListItem([]).
- readList(List):-readListItem(List).
- equal([], [], X):- X=1,!.
- equal([X|T1],[X|T2], X):- equal(T1,T2, X).
- equal([X|_],[Y|_], X):- X=0, !.
- menu0 :- write("Vvedite spisok L1"), nl, readlist(L1) ,write("Vvedite spisok L2"), nl,
- readlist(L2) , write("L1 =", L1, "L2 = ", L2), nl, menu(-1, L1, L2).
- menu(0, _, _).
- menu(V, L1, L2) :- V = -1, write("0. Exit \n 1. Vvod spiska \n 2. Start the program \n Answer = "), readint(M), menu(M, L1, L2);
- V = 1, menu0;
- V = 2, equal (L1, L2, X), write ("answer=", X),nl, menu(-1, L1, L2).
- goal menu0.
Ошибка исправлена, помощь больше не требуется
Решение задачи: «Проверить эквивалентность двух списков»
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
, которое указывает на неравенство, если первые элементы списков не равны.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д