首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >切断从句的开头以及“削减”、``!‘和`失败’之间的关系

切断从句的开头以及“削减”、``!‘和`失败’之间的关系
EN

Stack Overflow用户
提问于 2015-02-24 04:39:08
回答 1查看 416关注 0票数 2

把削减(!)放在子句的开头意味着什么?

代码语言:javascript
复制
  p(X,Y) :- !, q(X), r(X,Y).

!fail有什么区别,它们之间有什么关系?

谢谢。

我认为对于fail来说,谓词只会“失败”lol,这与不回溯不同?我只想确定:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-24 12:49:14

通常,当您希望确保在某个变量实例化的组合中没有回溯时,可以使用此方法。显示一些代码(从SWI-Prolog实现借用一点)

代码语言:javascript
复制
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/2library(readutil)。它将其第二个参数与表示一行或输入末尾的原子end_of_file的代码列表统一起来。

read_lines_read/3的第一个子句中,我们在谓词定义的开头使用统一。如果我们想要考虑谓词,我们“要求”第一个参数必须是原子end_of_file。当(在输入的末尾)这个子句成功时,定义的第二个子句中的另一个可能的解决方案没有被考虑,而谓词成功,关闭第三个参数中的列表。

在这里使用的是:

代码语言:javascript
复制
?- 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将回到最新的选择点。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28688269

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档