【发布时间】:2015-05-20 05:09:29
【问题描述】:
我目前正在尝试理解 prolog 中的 DCG。
考虑这个例子。
digit(0) --> "0".
digit(1) --> "1".
binaryNumber(Val) --> digit(Val).
binaryNumber(Next*2 + Cur) -->
%CurVal #= Cur + Next*2,
binaryNumber(Next),
digit(Cur).
产生:
207 ?- binaryNumber(X, Y, []).
X = 0,
Y = [48] ;
X = 1,
Y = [49] ;
X = 0*2+0,
Y = [48, 48] ;
X = 0*2+1,
Y = [48, 49] ;
X = 1*2+0,
Y = [49, 48] ;
X = 1*2+1,
Y = [49, 49] ;
X = (0*2+0)*2+0,
这很好。
但是,如果我想将字符串“转换”为值:
:- use_module(library(clpfd)).
digit(0) --> "0".
digit(1) --> "1".
binaryNumber(Val) --> digit(Val).
binaryNumber(CurVal) -->
CurVal #= Cur + Next*2,
binaryNumber(Next),
digit(Cur).
我明白了:
209 ?- binaryNumber(X, Y, []).
X = 0,
Y = [48] ;
X = 1,
Y = [49] ;
ERROR: binaryNumber/3: Undefined procedure: (#=)/4
ERROR: However, there are definitions for:
ERROR: (#=)/2
Exception: (7) #=(_G4807345, _G4807428+_G4807431*2, _G4807346, _G4807475) ?
...
两个问题:
- 为什么
binaryNumber想要#=的“arity”为4? - 我该如何解决这个问题?
【问题讨论】:
-
@false:如果您对此感兴趣,该示例是合成的,用于训练。 IE。我对“如何将字符串转换为数字”不感兴趣,但对“如何在 prolog 中使用 dcgs 作为解析器”感兴趣。
-
但 DCG 正是在这里将某物列表“转换”为其他东西 - 反之亦然。
-
@false:意思是说对于字符串数字转换,通常有实用函数。所以其他人可能一直在寻找那个功能,而我正在寻找对 dcgs 的理解。有点不同的问题......