我目前正试图了解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? 答案 0 :(得分:4)
你非常关闭!
通常,dcg NSDictionary
并非“直接”实现,而是通过将语法foo//n
翻译为相应的Prolog谓词foo//n
。此翻译由term_expansion/2
完成,这是一种类似于其他语言中的宏的机制。通常,你根本不需要考虑它。
有关dcg的更多信息,请阅读:(1)this DCG primer,以及(2)问题 “Is there a way or an algorithm to convert DCG into normal definite clauses in Prolog?”以及该问题的答案。
回到主题,我在dcg使用中看到两个问题: