Проверить эквивалентность двух списков - Prolog

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! У меня изначально был написан такой алгоритм:
Листинг программы
  1. domains
  2. i = integer
  3. list = i*
  4. predicates
  5. nondeterm equal(list, list)
  6. clauses
  7. equal([], []):- true,!.
  8. equal([X|T1],[X|T2]):- equal(T1,T2).
  9. equal([X|_],[Y|_]):- fail, !.
  10. goal
  11. equal ([0,0,0], [0,0]).
И все работало нормально. Но после встраивания в программу меню и добавления предиката для ввода списка, все как-то начало падать при вводе разных список. В чем проблема?
Листинг программы
  1. domains
  2. i = integer
  3. list = i*
  4. predicates
  5. nondeterm equal(list, list, i)
  6. nondeterm menu (i, list, list)
  7. nondeterm menu0
  8. readListItem(list)
  9. readList(list)
  10. clauses
  11. readListItem([H|T]):- readint(X), X <> ' ', !, H = X, readListItem(T).
  12. readListItem([]).
  13. readList(List):-readListItem(List).
  14. equal([], [], X):- X=1,!.
  15. equal([X|T1],[X|T2], X):- equal(T1,T2, X).
  16. equal([X|_],[Y|_], X):- X=0, !.
  17. menu0 :- write("Vvedite spisok L1"), nl, readlist(L1) ,write("Vvedite spisok L2"), nl,
  18. readlist(L2) , write("L1 =", L1, "L2 = ", L2), nl, menu(-1, L1, L2).
  19. menu(0, _, _).
  20. 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);
  21. V = 1, menu0;
  22. V = 2, equal (L1, L2, X), write ("answer=", X),nl, menu(-1, L1, L2).
  23. goal menu0.
Ошибка исправлена, помощь больше не требуется

Решение задачи: «Проверить эквивалентность двух списков»

textual
Листинг программы
  1. domains
  2. int=integer
  3. intl=int*
  4.  
  5. predicates
  6. equal(intl,intl)
  7.  
  8. clauses
  9. equal([],[]).
  10. equal([_],[]) :- fail.
  11. equal([],[_]) :- fail.
  12. equal([X|T1],[X|T2]) :- equal(T1,T2).
  13. equal([X|_],[Y|_]) :- X<>Y, fail.

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

  1. domains - определение типов данных для переменных. В данном случае, int это целочисленный тип данных, а intl это указатель на массив целочисленных значений.
  2. predicates - определение пользовательских предикатов. В данном случае, equal это предикат, который проверяет эквивалентность двух списков.
  3. clauses - определение правил (условий) для предиката equal. Первое правило говорит, что если оба списка пустые, то они эквивалентны. Второе и третье правила указывают на неравенство, если списки не пустые и если первый список пустой, а второй не пустой и наоборот. Четвертое правило говорит, что если первые элементы списков не равны, то списки не эквивалентны.
  4. equal([],[]). - первое правило в clauses, которое говорит, что если оба списка пустые, то они эквивалентны.
  5. equal([_],[]) :- fail. - второе правило в clauses, которое указывает на неравенство, если первый список не пустой.
  6. equal([],[_]) :- fail. - третье правило в clauses, которое указывает на неравенство, если второй список не пустой.
  7. equal([X|T1],[X|T2]) :- equal(T1,T2). - четвертое правило в clauses, которое рекурсивно вызывает предикат equal для оставшейся части списков.
  8. equal([X|_],[Y|_]) :- X<>Y, fail. - пятое правило в clauses, которое указывает на неравенство, если первые элементы списков не равны.

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


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

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

11   голосов , оценка 3.818 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы