DFA删除不可接受的字符

时间:2019-01-10 16:43:46

标签: list prolog dfa

所以我代表这个DFA:

enter image description here

喜欢

initial(0).
final(2).
arc(0,a,1).
arc(0,b,0).
arc(1,a,1).
arc(1,b,2).
arc(2,a,2).
arc(2,b,2).  

我有一个谓词,可以解析字符串并在可接受的情况下返回true:

transition(X,[A|B]) :- arc(X,A,T),transition(T,B).  
transition(X,[]) :- final(X).
parse(X) :- initial(S),transition(S,X).

现在,我想建立一个谓词check(X,Y),该谓词将列出一个列表并删除所有不是ab的索引。 Y将是不包含错误索引的新列表。

例如:

?-check([a,1,b,c,b],Y).
Y=[a,b,b];
false

我不喜欢Prolog,我尝试了很多东西,但是什么也没做。 你能给我一个指导方针如何使支票谓语吗?

1 个答案:

答案 0 :(得分:1)

我将假设您有一个字符原子列表,例如[a,b,c,d,e,f,a,b,c],而您希望它是[a,b,a,b]。空列表是您的基本情况:

check([], []).

然后,担心当前字符是否在您可接受的列表中:

check([C|Cs], Result) :- 
    check(Cs, Rs),
    (arc(_, C, _) 
        -> Result = [C|Rs]
        ;  Result = Rs).

实际情况:

?- check([a,b,c,d,a,b,e], X).
X = [a, b, a, b].

如有必要,您可以使用string_chars/2在SWI字符串和此表示形式之间进行转换:

?- string_chars("abcdabe", S), check(S, SFiltered), string_chars(FilteredString, SFiltered).
S = [a, b, c, d, a, b, e],
SFiltered = [a, b, a, b],
FilteredString = "abab".