把削减(!)放在子句的开头意味着什么?
p(X,Y) :- !, q(X), r(X,Y).!和fail有什么区别,它们之间有什么关系?
谢谢。
我认为对于fail来说,谓词只会“失败”lol,这与不回溯不同?我只想确定:)
发布于 2015-02-24 12:49:14
通常,当您希望确保在某个变量实例化的组合中没有回溯时,可以使用此方法。显示一些代码(从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将回到最新的选择点。
https://stackoverflow.com/questions/28688269
复制相似问题