检查字符串是否包含在语言中(Prolog)

csh*_*579 4 prolog context-free-grammar dcg

这是CFG:

S -> T | V
T -> UU
U -> aUb | ab
V -> aVb | aWb
W -> bWa | ba
Run Code Online (Sandbox Code Playgroud)

所以这将接受某种形式的:

{a^n b^n a^m b^m | n,m >= 1} U {a^n b^m a^m b^n | n,m >= 1}
Run Code Online (Sandbox Code Playgroud)

这是我正在使用的代码:

in_lang([]).  
in_lang(L) :-
    mapS(L), !.

mapS(L) :-
    mapT(L) ; mapV(L),!.

mapT(L) :-
    append(L1, mapU(L), L), mapU(L1), !.

mapU([a|T]) :-
    ((append(L1,[b],T), mapU(L1)) ; (T = b)),!.

mapV([a|T]) :-
    ((append(L1,[b],T), mapV(L1)) ; 
     (append(L1,[b],T), mapW(L1))),
    !.

mapW([b|T]) :-
    ((append(L1,[a],T), mapW(L1)) ;
     (T = a)),
    !.
Run Code Online (Sandbox Code Playgroud)

截至目前,这对于以下三个字符串返回false:

[a,a,b,b,a,b] // this should be true
[a,a,a,b,b,a,a,b,b,b] // this should be true as well
[a,a,a,b,b,a,b,b,b] // this one IS false
Run Code Online (Sandbox Code Playgroud)

任何帮助或见解都会非常感激,我对Prolog不太满意,所以自己调试这个问题一直是个挑战.

fal*_*lse 6

只需使用!并且library(double_quotes).

:- set_prolog_flag(double_quotes, chars).

s --> t | v.
t --> u, u.
u --> "a",u,"b" | "ab".
v --> "a",v,"b" | "a",w,"b".
w --> "b",w,"a" | "ba".

| ?- use_module(library(double_quotes)).

| ?- length(L,N), phrase(s, L).
L = "abab", N = 4 ? ;
L = "abab", N = 4 ? ;
L = "aabbab", N = 6 ? ;
L = "abaabb", N = 6 ? ;
L = "aababb", N = 6 ? ;
L = "abbaab", N = 6 ? ;
L = "aaabbbab", N = 8 ? ;
L = "aabbaabb", N = 8 ? ;
L = "abaaabbb", N = 8 ? ;
L = "aaababbb", N = 8 ? ...
Run Code Online (Sandbox Code Playgroud)

  • @ScottHunter从至少1965年到1972年,人们偶然发现了对这个问题的无知:如何正确地编码语法.他们都尝试了一些类似追加的野兽.让我们不要把这个黑暗时期延续下去.自1972年夏天以来没有任何借口! (3认同)
  • @ScottHunter:事实上,仍然有很多无DCG的Prolog课程.这是一个矛盾的说法:发现特定于DCG的编码是44年前Prolog构思的原因.更新时间! (3认同)
  • @ScottHunter公平地说,问题陈述是_screams_ DCG.如果OP的"明显的无知"正是如此,我不会感到惊讶. (2认同)