- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下代码将等效对象序列组合在一起:
pack([], []).
pack([X], [X]).
pack([H, T|TS], [H|TR]):-
H \= T,
pack([T|TS], TR).
pack([H, H|HS], [[H|TFR]|TR]):-
pack([H|HS], [TFR|TR]).
我的输入是:
pack([1,1,1,1,2,3,3,1,1,4,5,5,5,5], X).
结果我得到:
[[1,1,1|1],2,[3|3],[1|1],4,[5,5,5|5]]
您是否注意到每个列表中最后一个元素之前的 |
符号?我不知道它为什么会出现以及如何修复它。有什么想法吗?
最佳答案
列表是一种数据类型,具有两种类型的仿函数/常量:
[]
;和[element|list]
。如第二个选项所示,cons 的第二个参数应该是一个列表。这可能是另一个缺点(因此进一步递归),或者是一个空列表。尽管如此,Prolog 并不是真正类型化的,因此您可以使用整数、字符...作为第二项,但它不是列表。
所以现在的问题是,“我们如何构造这样奇怪的列表”。在这个答案中,我使用了一个较小的示例来重现错误,因为它使事情变得更容易:
?- trace.
true.
[trace] ?- pack([1,1], X).
Call: (7) pack([1, 1], _G1066) ? creep
Call: (8) 1\=1 ? creep
Fail: (8) 1\=1 ? creep
Redo: (7) pack([1, 1], _G1066) ? creep
Call: (8) pack([1], [_G1144|_G1141]) ? creep
Exit: (8) pack([1], [1]) ? creep
Exit: (7) pack([1, 1], [[1|1]]) ? creep
X = [[1|1]] .
如果我们这样打包两个元素,就会出错。首先我们调用 pack([1,1],X)
。
首先触发第三个子句,但 H\= T
项失败。因此,Prolog 重做 调用,但现在使用last 子句。在最后一个子句中,我们看到了一些奇怪的东西:
pack([H, H|HS], [[H|<b>TFR</b>]|TR]):-
pack([H|HS], [<b>TFR</b>|TR]).
我们看到的是我们使用 [TFR|TR]
对 pack/2
执行递归调用。所以这意味着 [TFR|TR]
应该是一个列表列表。但是第二个子句不会生成列表列表,而只会生成一个项目列表。所以错误在:
pack([X], <b>[X]</b>).
%% ^ list of items??
所以我们需要做的是解决错误,将第二个子句重写为:
pack([X], <b>[[X]]</b>).
%% ^ list of list
现在我们已经解决了那个问题,但我们还没有解决:还有一个第三个子句中的类型错误:
pack([H, T|TS], [<b>H</b>|TR]):-
%% ^ item instead of a list?
H \= T,
pack([T|TS], TR).
同样,我们可以简单地使其成为一个项目列表:
pack([H, T|TS], [<b>[H]</b>|TR]):-
%% ^ list
H \= T,
pack([T|TS], TR).
现在我们得到如下代码:
pack([], []).
pack([X], <b>[</b>[X]<b>]</b>).
pack([H, T|TS], [<b>[</b>H<b>]</b>|TR]):-
H \= T,
pack([T|TS], TR).
pack([H, H|HS], [[H|TFR]|TR]):-
pack([H|HS], [TFR|TR]).
然后我们得到:
?- pack([1,1,1,1,2,3,3,1,1,4,5,5,5,5], X).
X = [[1, 1, 1, 1], [2], [3, 3], [1, 1], [4], [5, 5, 5|...]] [write]
X = [[1, 1, 1, 1], [2], [3, 3], [1, 1], [4], [5, 5, 5, 5]] .
编辑:
如果只有一个元素,您显然不想构建列表。这使问题变得有点困难。有两种选择:
最后一个很简单,所以让我们做第一个。在那种情况下,第二个条款确实应该是:
pack([X],[X]).
现在第二个子句应该是:
pack([H, T|TS], [H|TR]):-
H \= T,
pack([T|TS], TR).
还有。但最后一个条款更难:
pack([H, H|HS], [[H|TFR]|TR]):-
pack([H|HS], [TFR|TR]).
这里有两种可能:
TFR
是一个项目列表,在这种情况下,我们只需在列表前加上;或TFR
不是列表,在这种情况下我们构造一个列表。为了解决这个问题,我们可以定义一个谓词:
prepend_list(H,[HH|T],[H,HH|T]).
prepend_list(H,X,[H,X]) :-
X \= [_|_].
然后使用:
pack([H, H|HS], [HTFR|TR]):-
pack([H|HS], [TFR|TR]),
prepend_list(H,TFR,HTFR).
现在我们得到:
pack([], []).
pack([X], [X]).
pack([H, T|TS], [H|TR]):-
H \= T,
pack([T|TS], TR).
pack([H, H|HS], [HTFR|TR]):-
pack([H|HS], [TFR|TR]),
prepend_list(H,TFR,HTFR).
prepend_list(H,[HH|T],[H,HH|T]).
prepend_list(H,X,[H,X]) :-
X \= [_|_].
但是请注意,如果您想pack/2
列出自身,此程序将失败。在那种情况下,您最好还是使用后处理步骤。
现在它构造:
?- pack([1,1,1,1,2,3,3,1,1,4,5,5,5,5], X).
X = [[1, 1, 1, 1], 2, [3, 3], [1, 1], 4, [5, 5, 5|...]] [write]
X = [[1, 1, 1, 1], 2, [3, 3], [1, 1], 4, [5, 5, 5, 5]] .
关于list - 为什么在 SWI Prolog 中,我得到带有 `|` 符号的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44316228/
给定一个字符串,例如 s="##$$$#",我如何找到索引之前的“#”符号数等于“”数的索引$"符号在索引之后? 示例:如果 s="##$$$#",则输出将为 2。 解释:在索引 2 之前我们有 2
在本教程中,您将借助示例了解 JavaScript 符号。 JavaScript 符号 JavaScript ES6 引入了一种新的原始数据类型,称为 Symbol(符号)。符号是不可变的(不能更改)
在“函数编程的工艺”一书中,符号 '>.>' 将函数连接在一起,与 '.' 的方向相反。但是当我使用 ghci 实现它时,它显示了超出范围的错误 '>.>'。为什么?它是不再使用的旧符号吗? 最佳答案
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我需要从向量中删除 \"。这是我的数据: data <- c("\"https://click.linksynergy.com/link?id=RUxZriH*PWc&offerid=323058.1
我在 Nginx 配置中使用正则表达式来捕获文件 URL,但如果文件 URL 包含 # 符号,正则表达式模式将不会捕获它。 这里是nginx的配置部分。 location ~ ^/p/(?[\w\-=
如何使 & 符号在此图表的第一组条形/列下正确显示: http://jsfiddle.net/VxbrK/2/ 应该是“Apples & Oranges”而不是“Apples & Oranges”。
**在verilog中是什么意思? 我为测试台提供了以下逻辑 localparam NUM_INPUT_BITS = 1; localparam NUM_OUTPUT_BITS
我有一个使用正则表达式来验证电子邮件地址的方法。 public String searchFormail(String searchWord) { Pattern pattern = Patt
我想将一个字符串拆分为数字部分和文本/符号部分我当前的代码不包含负数或小数,并且表现得很奇怪,在输出的末尾添加了一个空列表元素 import re mystring = 'AD%5(6ag 0.33-
我有一些代码需要从数组中选择一个随机字符串,但它一直返回单个字母或数字。如何解决这个问题? var name = ["Yayek", "Vozarut", "Gezex",
我刚开始使用 Python,我在考虑应该使用哪种表示法。我读过 PEP 8关于 Python 符号的指南,我同意那里的大多数内容,除了函数名称(我更喜欢混合大小写风格)。 在 C++ 中,我使用匈牙利
在用 C# 编写代码时,我错误地在 if 语句中的变量前添加了一个符号(而不是感叹号)。 bool b = false; if (@b) { } 我很惊讶它编译成功,没有任何错误。 我想知道:上面的代
本文实例为大家分享了特殊字符替换电话号码中某一部分的方法,ios利用-号替换电话号码中间四位,供大家参考,具体内容如下 1、效果图 2、代码 rootviewcontroll
当我使用“x”和“z”作为符号时,这段代码没有问题: from sympy import * x, z = symbols('x z') y = -6*x**2 + 2*x*z**0.5 + 50*x
我需要从文本中删除标点符号: data <- "Type the command AT&W enter. in order to save the new protocol on modem;"
我有几个数字是 numeric 类。下面的例子。 df = c(12974,12412,124124,124124,34543,4576547,32235) 现在我想在每个数字前添加 '$' 符号而不
我有一个 highcharts 图例,其中符号以不同的大小显示,因为它们在实际图表中的大小不同。不幸的是,当数据点的大小增加时,它们也会在图例中增加。无论数据点大小如何,我都希望图例符号保持相同的大小
我需要使用包含平均值+-SD的标题。到目前为止,我只能得到以下信息: "Mean +- SD or N (%)" [1] "Mean +- SD or N (%)" 如何直接使用“+-”符号?您知道一
使用 XSLT 和 XPath 1.0,我有一个要转义的字符串以用于 URL,例如: one word & another 因此,描述元素的 text() 应该进行 URL 转义。 我该怎么做
我是一名优秀的程序员,十分优秀!