- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我看来,应该能够使用字节列表上的 DCG 处理二进制数据。但是,要使其正常工作,必须使用按位运算,这意味着 is/2
涉及,这意味着实例化顺序是一个问题,这可能会混淆使用 DCG 进行解析和生成。这里的想法是序列化/反序列化二进制数据,但我认为这个例子很简单,足以说明问题。
让我用一些代码来说明。假设我有一个二进制协议(protocol)。我想从一个字节中读取两个 4 位整数。我天真的自我尝试了这个:
two_four_bit_ints(High, Low) -->
[B],
{
High is B >> 4,
Low is B /\ 0xF
}.
?- phrase(two_four_bit_ints(H,L), [255]).
H = L, L = 15.
?- phrase(two_four_bit_ints(H,L), [0]).
H = L, L = 0.
?- phrase(two_four_bit_ints(H,L), [15]).
H = 0,
L = 15.
?- phrase(two_four_bit_ints(H,L), [240]).
H = 15,
L = 0.
?- phrase(two_four_bit_ints(15,15), [X]).
ERROR: is/2: Arguments are not sufficiently instantiated
?- phrase(two_four_bit_ints(15,15), X).
ERROR: is/2: Arguments are not sufficiently instantiated
clpfd
”,但它似乎不支持位移操作,而且我担心在低级代码中间调用如此强大的系统的性能影响。
最佳答案
更好地支持二进制数据将是 Prolog 中的一个非常好的功能。然而,Prolog 的关系特性使得通用解决方案非常困难。所以你面临一个严肃的决定:要么将一些其他语言的库直接映射到 Prolog,从而忽略 Prolog 的关系性质(理想情况下避免所有边界与干净的实例化错误),要么选择更关系的方法。
选择更加关系的解决方案时,您可以使用现有库为library(clfd)
或自己实现整个约束机制。通过一些巧妙的限制,您可能会采用更简单的方法,但我怀疑这会奏效。权衡是在正确性和效率方面。请注意,SICStus 或 SWI 中的 clpfd
系统实际上需要数十年才能达到其质量水平。
无论您采取哪种方式,请注意:library(clpfd)
的效率
SWI-Prolog 中的 library(clpfd)
经过专门优化,在性能上(在某些情况下)与传统的 (is)/2
相当。要看到这一点,请编译规则:
list_len([_|Es], N0) :- N0 #> 0, N1 #= N0-1, list_len(Es, N1).
listing(list_len)
查看生成的代码:
list_len([_|C], A) :-
( integer(A)
-> A>=0+1
; clpfd:clpfd_geq(A, 1)
),
( integer(A)
-> B is A+ -1
; clpfd:clpfd_equal(B, A-1)
),
list_len(C, B).
(is)/2
和
(>=)/2
)的内置函数用于直接对应于这些原始操作的情况。
(div)/2
,目前仅 SICStus 的
library(clpfd)
支持但 SWI 不支持。所以一些额外的头痛会在这里等着你。但只要您使用无符号非负值,就不会出现问题。对于一般类次,您将需要 SWI 支持但 SICStus 不支持的
(^)/2
。
two_four_bit_ints(High, Low) -->
[B],
{ B in 0..255,
Low in 0..15,
High in 0..15,
B #= Low + High*16
}.
B = -1234
、
B = 1+1
。您可以添加
between(0, 255, B)
但随后您将轻松获得组合枚举(阅读:爆炸)。
library(clpfd)
的当前实现可能会进一步得到显着改进,但为了改进它们,必须使用它们!
pio
get_byte/1
),get_code/1
) 和 get_char/1
)。 library(pio)
。目前,
library(pio)
只支持
codes
。
关于Prolog - 使用 DCG 处理二进制数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26683738/
这个答案:Very basic dcg prolog syntax对我有一点帮助,但 [X] 只能得到下一个字符,我想要整个辣酱 Jade 米饼馅,继续阅读! 我正在使用 GNU Prolog 编写一
在此 site ,我找到了解释如何使用 DCG 构建右手上下文符号的部分 A → ε | a A Head, [T_1,...,T_n] --> Body. 有人帮助我通过示例找出这种方法并说明它解析
我知道 Prolog 程序员通常使用 DCG 而不是正则表达式来匹配字符串中的模式。在 Perl 中,可以这样写 if ( '... accd' =~ /a+b*c{2,4}d$/ ) { s
我在创建问答 Prolog 文件时遇到问题。我有一个包含位置的数据库,我已经可以得到问题并写出答案。但是有不同类型的对象,需要不同的前缀。所以我为前缀定义了 DCG。 answer(P,A) :- l
我有两个人的 DCG 句子,分别代表一个男性和一个女性。我想用“他”或“她”来指代前一句中提到的人。 假设我们有这些 DCG: father --> [Peter]. mother --> [Isab
假设我将“a-list”称为零个或多个“a”的列表: % as = [a,a,a] as --> []. as --> [a], as. 假设我想表示一个“b-list”,一个由零个或多个 a-lis
我有一个手动制定的 DCG 规则来选择惯用短语超过单个单词。 DCG规则如下: seq(cons(X,Y), I, O) :- noun(X, I, H), seq(Y, H, O), \+ noun
我正在玩 DCG,我有这段代码。这将显示 x 个 0 和 x 个 A。 y --> test(Count), as(Count). test(0) --> []. test(succ(0)) -->
你好,我是 Prolog 和 DGC 的新手。我想编写一个 DCG 来解析时间表达式,例如 10.20 am 或 12 oclock。我如何检查 10.20 am 对于 Olcock 是否是有效表达式
最近我一直在 Prolog 中使用 DCG,但我一直面临一些关于它究竟如何工作的问题。例如,我有这个小语法: :: | :: | | | :: 'a' | 'b' ... |'Z
我开始学习如何使用 DCG。我想知道花括号 {...} 的用途是什么?何时(何时不)需要它们?例如: read_lines --> { read_line_to_codes(current_inp
我正在尝试为一个有效号码指定一个 DCG,该号码将像这样使用: value(Number) --> valid_number(Number). 基本上检查一个指定的值是否是数字,(它也可能是一个变量,
假设我想编写一个自定义运算符,用于以重复的方式编写 DCG 规则。 例如,假设我有一个 DCG,ws使得: ws --> []. ws --> " ", ws. 匹配零个或多个空格。显然,如果我想在我
我在 SWI Prolog 中编写了一个程序来测试字符串是否是回文。 DCG 中的这个任务我能够弄清楚,而且非常简单。 palindrome --> [X], palindrome, [X]. pa
所以我正在使用 Definite Clause Grammars 在 SWI-Prolog 中为 Pascal 编写一个简单的解析器。 我不明白如何实现重复(2 个或更多)或可选地重复(1 个或更多)
我正在构建一个明确的从句语法来解析 20,000 条半自然文本。随着我的谓词数据库的大小增长(现在多达 1,200 条规则),解析一个字符串可能需要相当长的时间——特别是对于 DCG 当前无法解释的字
在我看来,应该能够使用字节列表上的 DCG 处理二进制数据。但是,要使其正常工作,必须使用按位运算,这意味着 is/2涉及,这意味着实例化顺序是一个问题,这可能会混淆使用 DCG 进行解析和生成。这里
我目前有一个包含几个人和一些关系谓词的小型 Prolog 数据库。例如: female(anna). female(susan). male(john). male(timmy). siblings(
我正在为查询引擎编写一个解析器。我的解析器 DCG 查询 不是确定性的。 我将以关系方式使用解析器来检查和综合查询。 解析器 DCG 不具有确定性是否合适? 在代码中: 如果我希望能够以两种方式使用
我需要使用 swi-prolog 中的规则拆分二氯戊烷这就是我尝试做的 stem--> [meth]|[eth]|[prop]|[but]|[pent]. suf --> [ane]|[ene]|[y
我是一名优秀的程序员,十分优秀!