如何将DCG翻译成PROLOG中的普通定冠词?

如何将DCG翻译成PROLOG中的普通定冠词?,prolog,dcg,prolog-toplevel,Prolog,Dcg,Prolog Toplevel,您如何将以下DCG翻译成序言中的普通定冠词? expr_regular --> cor_ini,numero,guion,numero,cor_fin. cor_ini --> ['[']. numero --> ['0'];['1'];['2'];['3'];['4'];['5'];['6'];['7'];['8'];['9']. cor_fin --> [']']. guion --> ['-']. 编辑:我想把DCG翻译成普通的PROLOG子句,因为我不能在

您如何将以下DCG翻译成序言中的普通定冠词?

expr_regular --> cor_ini,numero,guion,numero,cor_fin.
cor_ini --> ['['].
numero --> ['0'];['1'];['2'];['3'];['4'];['5'];['6'];['7'];['8'];['9'].
cor_fin --> [']'].
guion --> ['-'].
编辑:我想把DCG翻译成普通的PROLOG子句,因为我不能在同一代码中同时使用DCG和普通子句(在我的例子中)。我有两段代码:

第1段:

traducir(Xs, Ys) :- maplist(traduccion, Xs, Ys).
traduccion('^',comeza_por).
traduccion('[',inicio_rango).
traduccion('0',cero).
traduccion('-',a).
traduccion('9',nove).
traduccion(']',fin_rango).
如何使用它的一个例子是:

?- traducir(['[','0','-','9',']'],[]).
true .
traducir(['^','[','0','-','9',']'],X).
X = [comeza_por, inicio_rango, cero, a, nove, fin_rango].
第2段:

 traducir--> cor_ini,numero,guion,numero,cor_fin.
 cor_ini --> ['['].
 numero --> ['0'];['1'];['2'];['3'];['4'];['5'];['6'];['7'];['8'];['9'].
 cor_fin --> [']'].
 guion --> ['-'].
如何使用它的一个例子是:

?- traducir(['[','0','-','9',']'],[]).
true .
traducir(['^','[','0','-','9',']'],X).
X = [comeza_por, inicio_rango, cero, a, nove, fin_rango].
我想将这两个代码合并为一个,以测试traducir是否编写良好(如果它遵循DCG),并将您输入的内容转换为文本,因此最终的程序应该能够执行以下操作:

?- traducir(['^','[','0','-','9',']'],X).
X = [comeza_por, inicio_rango, cero, a, nove, fin_rango].
?- traducir(['[','0','-','9',']'],[]).
true .

我真的不明白你的问题。无论如何,如果出于某种原因您不想使用漂亮的DCGs语法,您仍然可以使用类似于
通配符匹配/2
,或者重新发明轮子,自己使用差异列表来重新实现DCGs,或者追加。对于
通配符匹配/2
部分:

expr_regular(R) :- wildcard_match('[[][0-9]-[0-9]]', R).

你的语法非常简单:只有终端。因此,我们可以转换为一个非常特定的模式(注意:不允许泛化)


唯一值得注意的是它是ISO标准字符表示法…

在SWI Prolog中,您可以直接在以下页面上使用
列表/1


就这样您可以通过查看相关问题的答案获益。

这是一个有效的DCG。问题是什么?遗憾的是,
清单/0
(没有任何参数)最近在SWI中变得非常无用。还有太多的东西要看。