пролог отрезан в методе - PullRequest
       18

пролог отрезан в методе

1 голос
/ 13 ноября 2009

У меня есть вопрос, который я хотел бы задать вам о фрагменте кода:

insert_pq(State, [], [State]) :- !.
insert_pq(State, [H|Tail], [State, H|Tail]) :-
    precedes(State, H).
insert_pq(State, [H|T], [H|Tnew]) :-
    insert_pq(State, T, Tnew).
precedes(X, Y) :- X < Y.  % < needs to be defined depending on problem

функция довольно четко добавляет элемент в приоритетную очередь. У меня проблема с оператором обрезания в первой строке. Предположительно, всякий раз, когда вызов достигает этой строки кода, это единственно возможное решение для запроса, и вызовы функций просто раскручиваются (или это заканчивается?), Не будет необходимости отслеживать и искать другое решение для запрос.

Так что это отсечение здесь излишне. Я прав в своем выводе?

Ответы [ 3 ]

1 голос
/ 14 ноября 2009

Конкретный метод, который пользователи компилятора исключают из использования предикатов-кандидатов, называется индексацией аргументов. Различные реализации пролога могут по умолчанию индексировать разное количество аргументов.

Поэтому, если вас беспокоит, индексируется ли аргумент или нет, вам следует проверить, сколько аргументов использует пролог, который вы используете. Согласно справочному руководству SWI по умолчанию индексирует только первый аргумент. Так что в вашем случае сокращение на самом деле не является избыточным. Однако вы можете явно указать, какие аргументы следует индексировать, используя предикаты index/1 и hash/1, которые связаны в приведенной выше ссылке.

Или вы можете просто изменить порядок аргументов, или вы можете просто сохранить сокращение.

1 голос
/ 13 ноября 2009

Да, любой полуприличный компилятор Prolog заметит, что нет другого предложения, где второй аргумент является пустым списком.

Это было бы более полезно в конце второго предложения, хотя я бы предпочел объединить второе и третье предложение и использовать локальный разрез (предваряет (...) -> ...; ...) .

0 голосов
/ 14 ноября 2009

Да, вы правы. Даже если компилятор не является наполовину приличным (что, безусловно, является SWI Prolog), худшее, что он может сделать, - это сопоставить второе и третье предложения, что немедленно завершится ошибкой.

Однако, если второе предложение совпадает, третье также подходит. Это предполагаемое поведение?

...