- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在Prolog中,传统上有两种表示字符序列的方式:
'a'
:一个字符(通常:单引号表示一个原子,如果 token 以小写字母开头,则可以将它们忽略。)0'a
:a
的代码。 ['a','b']
:字符列表。 [ 0'a, 0'b ]
:代码列表,即a
和b
的代码(因此可以避免输入实际的代码点值)。 "a"
代码列表。传统上,将双引号字符串分解为代码列表,并且即使SWI-Prolog将“双引号字符串”映射到特殊字符串数据类型,该表示法在DCG上下文中也适用于SWI-Prolog。 `0123`
。传统上,将反引号内的文本映射到一个原子(我认为,95 ISO标准只是避免了对反引号字符串的含义进行具体说明。“这将是ISO/IEC 13211的这一部分的有效扩展,将反引号字符串定义为表示字符串常量。”)。在SWI-Prolog中,除非引号 back_quotes
设置为要求其他行为,否则引号内的文本会分解为代码列表。 C
中可用:
zero(C) --> [C],{C = '0'}.
nonzero(C) --> [C],{member(C,['1','2','3','4','5','6','7','8','9'])}.
any_digit(C) --> zero(C).
any_digit(C) --> nonzero(C).
代码风格
zero(C) --> [C],{C = 0'0}.
nonzero(C) --> [C],{member(C,[0'1,0'2,0'3,0'4,0'5,0'6,0'7,0'8,0'9])}.
any_digit(C) --> zero(C).
any_digit(C) --> nonzero(C).
字符/代码透明样式
zero(C) --> [C],{C = '0'}.
zero(C) --> [C],{C = 0'0}.
nonzero(C) --> [C],{member(C,['1','2','3','4','5','6','7','8','9'])}.
nonzero(C) --> [C],{member(C,[0'1,0'2,0'3,0'4,0'5,0'6,0'7,0'8,0'9])}.
any_digit(C) --> zero(C).
any_digit(C) --> nonzero(C).
上面的代码还接受一系列交替的代码和字符(因为不能输入内容列表)。这可能不是问题)。生成时,将获得不需要的任意字符/代码混合,然后需要添加剪切。
Mode
指示符
zero(C,chars) --> [C],{C = '0'}.
zero(C,codes) --> [C],{C = 0'0}.
nonzero(C,chars) --> [C],{member(C,['1','2','3','4','5','6','7','8','9'])}.
nonzero(C,codes) --> [C],{member(C,[0'1,0'2,0'3,0'4,0'5,0'6,0'7,0'8,0'9])}.
any_digit(C,Mode) --> zero(C,Mode).
any_digit(C,Mode) --> nonzero(C,Mode).
使用方言功能的字符/代码透明样式
code_type/2
,它实际上适用于代码和字符(有一个对应的
char_type/2
,但恕我直言,在任何情况下,仅
chary_type/2
适用于字符和代码)以及“数字类”代码和字符会产生复合
digit(X)
:
?- code_type(0'9,digit(X)).
X = 9.
?- code_type('9',digit(X)).
X = 9.
?- findall(W,code_type('9',W),B).
B = [alnum,csym,prolog_identifier_continue,ascii,
digit,graph,to_lower(57),to_upper(57),
digit(9),xdigit(9)].
因此,可以编写此代码以获得清晰的字符/代码透明性:
zero(C) --> [C],{code_type(C,digit(0)}.
nonzero(C) --> [C],{code_type(C,digit(X),X>0}.
any_digit(C) --> zero(C).
any_digit(C) --> nonzero(C).
特别是在SWI-Prolog中
back_quotes
double_quotes
"string"
和
`string`
的解释。默认情况下,
"string"
解释为原子“字符串”,而
`string`
解释为“代码列表”。
?- string("foo"),\+atom("foo"),\+is_list("foo").
true.
?- L=`foo`.
L = [102,111,111].
但是,在DCG中,默认情况下
"string"
和
`string`
都被解释为“代码”。
representation(double_quotes) --> "bar". % SWI-Prolog decomposes this into CODES
representation(back_quotes) --> `bar`. % SWI-Prolog decomposes this into CODES
representation(explicit_codes_1) --> [98,97,114]. % explicit CODES (as obtained via atom_codes(bar,Codes))
representation(explicit_codes_2) --> [0'b,0'a,0'r]. % explicit CODES
representation(explicit_chars) --> ['b','a','r']. % explicit CHARS
上面哪个匹配代码?
?-
findall(X,
(atom_codes(bar,Codes),
phrase(representation(X),Codes,[])),
Reps).
Reps = [double_quotes,back_quotes,explicit_codes_1,explicit_codes_2].
上面哪个与字符匹配?
?- findall(X,
(atom_chars(bar,Chars),phrase(representation(X),Chars,[])),
Reps).
Reps = [explicit_chars].
当使用
swipl --traditional
启动swipl时,使用
Syntax error: Operator expected
拒绝用反引号引起来的表示形式,但是否则没有任何变化。
最佳答案
Prolog标准(6.3.7)说:
A double quoted list is either an atom (6.3.1.3) or a list (6.3.5).
Welcome to SWI-Prolog (threaded, 64 bits, version 7.6.4)
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software.
Please run ?- license. for legal details.
For online help and background, visit http://www.swi-prolog.org
For built-in help, use ?- help(Topic). or ?- apropos(Word).
?- Foo = "foo", (atom(Foo) ; Foo = [F, O, O]).
false.
因此,默认情况下,SWI-Prolog不是Prolog。可以,但是如果您想了解SWI-Prolog的非Prolog行为,请调整问题的标签。
double_quotes
标志为其所需的值。您可以在代码和字符之间进行选择。与char相比,代码没有优势,但是在可读性和可键入性方面确实存在劣势。因此:
double_quotes
标志。
关于prolog - 是否应编写文本处理DCG来处理代码或字符?或两者?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66301190/
这个答案: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
我是一名优秀的程序员,十分优秀!