Обрезание начала предложения и связь между "cut", `!` И `fail`

Что значит поставить разрез (!в самом начале статьи?

  p(X,Y) :- !, q(X), r(X,Y).

В чем разница между ! а также fail и как они связаны?

Благодарю.
Я думаю, что для fail, предикат просто "провалится" LOL, который отличается от не возврата? просто хочу быть уверен:)

1 ответ

Решение

Обычно вы используете это, когда хотите убедиться, что не существует возврата к определенной комбинации переменных экземпляров. Чтобы показать некоторый код (немного позаимствованный из реализации SWI-Prolog:

read_lines(In, Ls) :-
    read_line_to_codes(In, Codes),
    read_lines_rest(Codes, In, Ls).

read_lines_rest(end_of_file, _, []) :- !.
read_lines_rest(Codes, In, [Codes|Rest]) :-
    read_line_to_codes(In, New_codes),
    read_lines_rest(New_codes, In, Rest).

Теперь, когда эти предикаты определены, вы можете читать входной поток (например, файл) в список строк. Мы используем read_line_to_codes/2 от library(readutil), Он объединит свой второй аргумент со списком кодов, представляющих строку или атом end_of_file в конце ввода.

В первом пункте read_lines_read/3 Мы используем объединение в главе определения предиката. Мы "требуем", чтобы первым аргументом был атом end_of_file если мы хотим, чтобы предикат даже рассматривался. Когда (в конце ввода) это предложение завершается успешно, другое возможное решение во втором предложении определения не принимается во внимание, и предикат завершается успешно, закрывая список в третьем аргументе.

Вот это используется:

?- open('shortcut.pl', read, In), read_lines(In, Ls), forall(member(L,Ls), format("~s~n", [L])).
read_lines(In, Ls) :-
    read_line_to_codes(In, Codes),
    read_lines_rest(Codes, In, Ls).

read_lines_rest(end_of_file, _, []) :- !.
read_lines_rest(Codes, In, [Codes|Rest]) :-
    read_line_to_codes(In, New_codes),
    read_lines_rest(New_codes, In, Rest).
% variable instantiations

Вы должны заметить, что предикат успешно выполняется ровно один раз. Попробуйте удалить вырез в первом предложении, чтобы увидеть, что происходит.

Для fail да, это делает предикат ошибочным (не успешным). На этом этапе, если остаются какие-либо точки выбора, Prolog вернется к самой последней.

Другие вопросы по тегам