DFA 删除不可接受的字符
DFA delete not acceptable characters
所以我代表这个 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).
我有一个解析字符串的谓词,如果可以接受,returns 为真:
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)
,它获取一个列表并删除所有不是 a
或 b
的索引。 Y 将是一个包含错误索引的新列表。
例如:
?-check([a,1,b,c,b],Y).
Y=[a,b,b];
false
我不喜欢 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".
所以我代表这个 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).
我有一个解析字符串的谓词,如果可以接受,returns 为真:
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)
,它获取一个列表并删除所有不是 a
或 b
的索引。 Y 将是一个包含错误索引的新列表。
例如:
?-check([a,1,b,c,b],Y).
Y=[a,b,b];
false
我不喜欢 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".