Prolog 切掉一个从句的开头和;切掉,`!`,和“失败”`

Prolog 切掉一个从句的开头和;切掉,`!`,和“失败”`,prolog,prolog-cut,Prolog,Prolog Cut,在一个子句的开头加上cut(!)是什么意思 p(X,Y) :- !, q(X), r(X,Y). 之间的区别是什么和失败以及它们之间的关系如何 谢谢。 我认为对于fail,谓词将只是“fail”lol,这与不回溯不同?只是想确保:)通常,当您想确保在变量实例化的特定组合上没有回溯时,可以使用此选项。要显示某些代码(借用了以下代码): 现在,定义了这些谓词后,您可以将输入流(例如文件)读取到行列表中。我们正在使用read\u line\u to\u codes/2from。它将把第二个参数与

在一个子句的开头加上cut(
)是什么意思

  p(X,Y) :- !, q(X), r(X,Y).
之间的区别是什么
失败
以及它们之间的关系如何

谢谢。

我认为对于
fail
,谓词将只是“fail”lol,这与不回溯不同?只是想确保:)

通常,当您想确保在变量实例化的特定组合上没有回溯时,可以使用此选项。要显示某些代码(借用了以下代码):

现在,定义了这些谓词后,您可以将输入流(例如文件)读取到行列表中。我们正在使用
read\u line\u to\u codes/2
from。它将把第二个参数与表示行的代码列表统一起来,或者在输入的末尾使用atom
end\u of_file

read\u lines\u read/3
的第一个子句中,我们在谓词定义的开头使用了统一。我们“要求”第一个参数必须是\u文件
的原子
end\u,如果我们想要甚至考虑谓词。When(在输入结束时)此子句成功,未考虑定义第二子句中的其他可能解决方案,谓词成功,结束了第三个参数中的列表

这里使用的是:

?- 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
您应该注意到谓词只成功一次。请尝试删除第一个子句中的cut,看看会发生什么


对于
fail
,是的,它使谓词失败(不成功)。此时,如果还有任何选择点,Prolog将返回到最近的一个。

yes。
fail
表示失败。:)这意味着它将返回。但是
表示剪切,表示不会从子句中的该点进一步回溯。如果您的示例是一个单子句谓词,那么它不会做任何事情,因为无论如何都没有什么可回溯的。但是,如果您在显示的那一个之后有另一个
p(X,Y):-s(X,Y)。
那么它将永远不会被执行,因为previor子句中只包含参数变量,并且在第二个子句之前总是匹配
p(X,Y)
查询。您应该得到一本好的序言书(比如Clocksin和Mellish用Prolog编写介绍性材料,或者Sterling和Shapiro用Prolog的艺术)因为他们非常透彻地解释了这些概念。:)好的,非常感谢,我确实下载了,但没有机会读,哈哈,但一定会读的!
?- 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