【问题标题】:DFA delete not acceptable charactersDFA 删除不可接受的字符
【发布时间】:2019-01-10 16:43:46
【问题描述】:

所以我代表这个 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).

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

例如:

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

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

【问题讨论】:

    标签: list prolog dfa


    【解决方案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".
    

    【讨论】:

      猜你喜欢
      • 2014-08-05
      • 2019-09-02
      • 2014-03-20
      • 1970-01-01
      • 1970-01-01
      • 2016-01-08
      • 2019-09-18
      • 2017-07-26
      • 2011-02-16
      相关资源
      最近更新 更多