Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List DFA删除不可接受的字符_List_Prolog_Dfa - Fatal编程技术网

List DFA删除不可接受的字符

List DFA删除不可接受的字符,list,prolog,dfa,List,Prolog,Dfa,因此,我代表DFA: 像这样 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),tr

因此,我代表DFA:

像这样

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).
现在我想做一个谓词检查x,Y,它取一个列表,删除所有不是a或b的索引。Y将是一个不包含错误索引的新列表

例如:

我不喜欢Prolog,我尝试了很多东西,但都没有达到我的要求。
你能给我一个如何做检查谓词的指南吗

我假设你有一个碳原子列表,比如[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".
?- 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".