На языке Пролог получаю ошибку о неизвестной процедуре

Написал код на языке Prolog, сохранил в файл my_program.pl и обратился к нему из корректной директории [my_program].

Получил предупреждение:

Warning: f:/program_training/функциональное и логическое программирование/interpreter/my_program.pl:9: Warning: Singleton variables: [T1]

Попробовал сделать запрос к предикату: ?- предшествует(apple, banana). и получил ошибку:

ERROR: Unknown procedure: предшествует/2 (DWIM could not correct goal) ^ Exception: (4) setup_call_cleanup('$toplevel':notrace(call_repl_loop_hook(begin, 0)), '$toplevel':'$query_loop'(0), '$toplevel':notrace(call_repl_loop_hook(end, 0))) ?

Вот код:

% Определяем предикат "предшествует/2"
предшествует(A, B) :-
    name(A, CodesA),      % Преобразуем атом A в список кодов символов
    name(B, CodesB),      % Преобразуем атом B в список кодов символов
    lexicographic_order(CodesA, CodesB).

% Вспомогательный предикат для проверки лексикографического порядка
lexicographic_order([], _).                    % Пустой список предшествует любому непустому списку
lexicographic_order([H1|T1], [H2|_]) :-        % Если первый элемент первого списка меньше первого элемента второго
    H1 < H2.                                    % То A предшествует B
lexicographic_order([H1|T1], [H2|T2]) :-        % Если равны, продолжаем сравнение
    H1 = H2,                                    % Сравниваем оставшиеся символы
    lexicographic_order(T1, T2).

Вроде, и T1 используется (хотя предупреждение говорило о неиспользуемой переменной), и девятая строка, соответственно, с Т1 корректна. Не знаю, в чем проблема и почему цель некорректна (предполагаю, что виной все та же самая Т1).

Буду благодарен за идеи, что не так


Ответы (1 шт):

Автор решения: Daniil Loban

Все дело в том, что хотя переменная Т1 используется, но не во всех предикатах.

Ошибки в языке выглядят очень отвратно, но тем не менее стоит понять в чем они и с ними проще бороться. Singleton говорит о том что переменная не используется, одиночка.

lexicographic_order([H1|T1], [H2|_]) :- % Если первый элемент первого списка меньше первого элемента второго
    H1 < H2.                            % То A предшествует B

Этот предикат в своем теле не использует T1. Вероятно, Вы просто забыли заменить и его на ананимную переменную _ после этого файл загружается без ошибок и работает как нужно:

?- предшествует(apple, banana).
true .

?- предшествует(banana, apple).
false.

Хотя по сути это был Warning не влияющий на выполнение в моем случае ничего не падало.

ERROR: Unknown procedure... говорит о том что вероятно Вы не загрузили свой скрипт в тот момент.

→ Ссылка