我正在尝试编写一个接受 u0v 形式的字符串的 dcg,其中 u 和 v 是字母表 {1, 2, 3} 上的字符串,u 是 revere 中的 v。我所拥有的似乎是这样的:查询的第一个答案是正确的,但随后它不断给出越来越多的错误答案,我想知道是否有一种方法可以在不使用剪切的情况下解决这个问题。这就是我现在所拥有的:
s --> a(X), [0], a(X).
s --> a(X), s, a(X).
a(X) -->[X].
a --> [1].
a --> [2].
a --> [3].
例如,我想得到
?- s([1,2,3,3,2,1,0|L], []).
L = [1, 2, 3, 3, 2, 1]; False.
相反,我得到:
L = [1, 2, 3, 3, 2, 1]
L = [0, 0, 1, 2, 3, 3, 2, 1]
L = [_1364, 0, _1364, 0, 1, 2, 3, 3, 2, 1]
L = [_1364, _1370, 0, _1370, _1364, 0, 1, 2, 3, 3, 2, 1]
L = [_1364, _1370, _1376, 0, _1376, _1370, _1364, 0, 1, 2, 3, 3, 2, 1]
L = [_1364, _1370, _1376, _1382, 0, _1382, _1376, _1370, _1364, 0, 1, 2, 3, 3, 2, 1] etc.
一个可能的解决方案:
s --> [0].
s --> a(X), s, a(X).
a(1) --> [1].
a(2) --> [2].
a(3) --> [3].
示例:
?- phrase(s, [1,2,3,3,2,1,0|L], []).
L = [1, 2, 3, 3, 2, 1] ;
false.
?- length(L,_), phrase(s,L,[]).
L = [0] ;
L = [1, 0, 1] ;
L = [2, 0, 2] ;
L = [3, 0, 3] ;
L = [1, 1, 0, 1, 1] ;
L = [1, 2, 0, 2, 1] ;
L = [1, 3, 0, 3, 1] ;
L = [2, 1, 0, 1, 2] ;
L = [2, 2, 0, 2, 2] ;
L = [2, 3, 0, 3, 2] ;
L = [3, 1, 0, 1, 3] ;
L = [3, 2, 0, 2, 3] ;
L = [3, 3, 0, 3, 3] ;
L = [1, 1, 1, 0, 1, 1, 1] ;
L = [1, 1, 2, 0, 2, 1, 1] ;
L = [1, 1, 3, 0, 3, 1, 1] ;
L = [1, 2, 1, 0, 1, 2, 1] ;
L = [1, 2, 2, 0, 2, 2, 1] ;
L = [1, 2, 3, 0, 3, 2, 1] ;
...