- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
首先,我已经阅读了SO上所有其他有关在Prolog中使用削减的文章,并且肯定会看到与使用削减有关的问题。但是,对我来说仍然有些不确定,我想一劳永逸地解决这个问题。
在下面的简单示例中,我们递归遍历列表,并检查每个第二元素是否等于1。这样做时,递归过程可能会在以下基本情况之一中结束:空列表或仅包含一个元素的列表。
base([]).
base([_]).
base([_,H|T]) :- H =:= 1, base(T).
?- time(base([1])).
% 0 inferences, 0.000 CPU in 0.000 seconds (74% CPU, 0 Lips)
true ;
% 2 inferences, 0.000 CPU in 0.000 seconds (83% CPU, 99502 Lips)
false.
?- time(base([3,1,3])).
% 2 inferences, 0.000 CPU in 0.000 seconds (79% CPU, 304044 Lips)
true ;
% 2 inferences, 0.000 CPU in 0.000 seconds (84% CPU, 122632 Lips)
false.
base([]).
base([_]) :- !.
base([_,H|T]) :- H =:= 1, base(T).
?- time(base([1])).
% 1 inferences, 0.000 CPU in 0.000 seconds (81% CPU, 49419 Lips)
true.
?- time(base([3,1,3])).
% 3 inferences, 0.000 CPU in 0.000 seconds (83% CPU, 388500 Lips)
true.
base([_,H|T]) :- H =:= 1, base(T).
base([_]).
base([]).
?- time(base([3,1])).
% 2 inferences, 0.000 CPU in 0.000 seconds (82% CPU, 99157 Lips)
true ;
% 2 inferences, 0.000 CPU in 0.000 seconds (85% CPU, 96632 Lips)
false.
base([_,H|T]) :- H =:= 1, base(T), !.
base([_]).
base([]).
?- time(base([3])).
% 1 inferences, 0.000 CPU in 0.000 seconds (81% CPU, 157679 Lips)
true.
?- time(base([3,1])).
% 3 inferences, 0.000 CPU in 0.000 seconds (83% CPU, 138447 Lips)
true.
?- time(base([3,1,3])).
% 3 inferences, 0.000 CPU in 0.000 seconds (82% CPU, 393649 Lips)
true.
base([]).
base([_]).
base([_,H|T]) :- H =:= 1, base(T), !.
?- time(base([1])).
% 0 inferences, 0.000 CPU in 0.000 seconds (83% CPU, 0 Lips)
true ;
% 2 inferences, 0.000 CPU in 0.000 seconds (84% CPU, 119546 Lips)
false.
最佳答案
总是尽量避免!/0
。 !/0
几乎总是会破坏程序的声明性语义。
可以通过模式匹配表示的所有内容都应该通过模式匹配来表示。在您的示例中:
每一秒([])。
every_second([_ | Ls]):-
every_second_(Ls)。
每一秒_([])。
every_second _([1 | Rest]):-every_second(Rest)。
就像在不纯的版本中一样,发布的示例没有任何选择要点:
?-every_second([1])。
真的。
?-every_second([3,1])。
真的。
?-every_second([3,1,3])。
真的。
还请注意,在此版本中,所有谓词都是完全纯净的,并且可以在所有方向使用。正如我们从逻辑关系中所期望的那样,该关系也适用于最一般的查询并生成答案:
?-every_second(Ls)。
Ls = [];
Ls = [_G774];
Ls = [_G774,1];
Ls = [_G774,1,_G780];
Ls = [_G774,1,_G780,1]。
由于您使用的谓词不正确或非声明性谓词(!/0
,(=:=)/2
),因此您发布的所有版本均无法做到这一点!
在推理列表时,几乎总是可以单独使用模式匹配来区分情况。如果无法做到这一点,请使用if_/3
进行逻辑纯净,同时仍保持可接受的性能。
关于序言: avoid redundant choice points (non-determinism) with and without cut operator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37775837/
我有三个数据框: df1: col1 col2 col3 name1 human experID1 name2 mouse experID2 name3 human
对于允许银行/电汇的支付系统,我需要将支付与相应的用户帐户可靠地关联起来。为此,用户应在与其帐户关联的转账中包含引用号。 我想用内置冗余(额外符号)生成这个数字,以便我可以检测和纠正最多 N 个以下(
我的术语可能有误,但有人可以解释为什么我们需要在类中包装 main 方法 吗?这对我来说似乎是多余的。然后你可以再次扩展这个类,完成一个 main 吗? package bears; import b
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit th
我正在将 Azure 移动服务用于生产移动应用程序。我正在查看 Azure 门户中的故障转移配置,但找不到任何相关信息。 有“流量管理器”,如 Azure documentation 中所述。 。但根
我为我的 Debian 项目创建了一个依赖点图(见图)。依赖关系包括冗余边。我想要一个没有那些冗余边的更简单的图形。我可以自己计算这些,但这并不容易,因为我在 CMakeLists.txt 和 .cm
以下内容已在 OS X 10.11.5 上使用 perl 5.24 进行了测试。 我编写了一个简短的程序 (perl-embed.pl) 来确定 Perl 在将字符串插入反引号时是否转义 shell
我为我的 Debian 项目创建了一个依赖点图(见图)。依赖关系包括冗余边。我想要一个没有那些冗余边的更简单的图形。我可以自己计算这些,但这并不容易,因为我在 CMakeLists.txt 和 .cm
我正在为一个 Web 应用程序项目设计一个数据库,我得出的结论是,我可能有一些查询,需要大量连接表才能进行一次检查。 我想知道将外键存储在某处以减少这些查询所需的联接数量有多糟糕? 举个我现在所拥有的
如果您认为自己有更好的标题,请随意改写标题。 如果你查看 bravo.js 的来源您会在第 807 行注意到以下内容。 module.declare = function main_module_de
我有一个通用函数,它返回 AnyListVM 的子类的新实例,基本上是这样实现的: public TListVM MakeListVM() where TListVM : An
我想了解用于纹理描述的非冗余局部二进制模式。原始LBP和非冗余LBP在纹理描述上有什么区别? 有人可以通过一个很好的例子来阐明上述主题吗? 最佳答案 非冗余局部二进制模式 (NRLBP) 描述符将 L
我正在构建一个数据库,其中包含自行车商店的大量商品。这家自行车店有许多相同的商品,例如 100 个尺寸为 4 且颜色为“红色”的车轮。我的问题是: 是向实体集添加“数量”字段并将所有相似项目放在一个实
这有点吓人。 我认为某处一定有一个设置可以解释为什么会发生这种情况。 在我们的解决方案中,大约有 50 个不同的项目。大多数情况下,这些库以命名空间 OurCompany 开头。 我们有 OurCom
为什么当警告级别处于 2 级或更高级别时,我会立即收到此琐碎代码示例的以下警告? public int Foo(int a) { if (a >= 0) throw new ArgumentE
这是我的代码: example = [1,-4,7,12] positiveSum :: [Int] -> Int positiveSum (x) = 0 positiveSum (x:xs) = r
为什么我在 Perl 中收到此错误“printf 中的冗余参数”?这表示格式字符串需要的值多于包含的值。我提供的格式字符串是否正确? 输入文件: Apollo 13 Ron
我已经习惯了elasticsearch很长一段时间了,但现在我试图找到的解决方案是列出给定搜索字符串的准确值。 我现在用java编写的代码: BoolQueryBuilder queryBuiler
我收到一条编译器警告,提示局部变量“newElement”是多余的。如何更有效地编写以下代码来消除我的代码中的此警告? Element newElement = new Element(left,el
我很好奇编译器如何处理下面的表达式: var collapsed = elements.GroupBy(elm => elm.OrderIdentifier).Select(group =>
我是一名优秀的程序员,十分优秀!