Обрезание начала предложения и связь между "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 вернется к самой последней.