编写包含反转的相同字符串的 DCG

问题描述 投票:0回答:1

我正在尝试编写一个接受 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.
prolog swi-prolog dcg
1个回答
0
投票

一个可能的解决方案:

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] ;
...

© www.soinside.com 2019 - 2024. All rights reserved.