我一直在想一个找到特定自动机中定义的所有无用状态的解决方案,我知道一种方法是从开始状态开始移动,然后要求以下状态存储在Prolog谓词中的所有这些状态数据库。我没有好好编写代码,因为我正在学习Prolog。我希望有人可以帮我解决这个问题。在这里,我留下了我拥有的东西。
有限状态机结构。 fa_start - >初始状态,fa_move - >从一个州到另一个州的有效移动,fa_final - >最终状态。
% Start State
:- assert(fa_start(fa_1, s_0)).
% Final States
:- assert(fa_final(fa_1, s_5)).
:- assert(fa_move(fa_1, s_0, s_1, a)).
:- assert(fa_move(fa_1, s_1, s_4, b)).
:- assert(fa_move(fa_1, s_0, s_2, c)).
:- assert(fa_move(fa_1, s_2, s_4, d)).
:- assert(fa_move(fa_1, s_2, s_5, e)).
:- assert(fa_move(fa_1, s_0, s_3, f)).
:- assert(fa_move(fa_1, s_3, s_5, g)).
:- assert(fa_move(fa_1, s_6, s_3, h)).
:- assert(fa_move(fa_1, s_6, s_7, i)).
:- assert(fa_move(fa_1, s_7, s_8, j)).
现在,这是我写的代码。我们的想法是从fa_start
开始,然后使用有效的fa_move继续移动,直到它无法到达fa_final
。
adjacent(fa, N, M):-
fa_move(fa, N, M, _).
adjacent_recursive(fa, N, L):-
fa_start(fa, N),
findall(l,adjacent(fa,N,_),L).
find_paths(fa):-
adjacent_recursive(fa,s_0,_).
提前感谢您的帮助。
答案 0 :(得分:2)
我知道很难找到与我的具体问题相关的准确信息。我一直在努力,最终找到了解决方案,可能不是最好的,但是达成协议。我将这个想法归功于this site。如果您发现了错误,那将是受欢迎的。
现在,下面的代码打印出无用状态,给出了如上所述实现的有限状态自动机。
find_useless_states(FA):- retractall(utiles(_)),retractall(visited(_)),
forall(fa_final(FA,S),assert(utiles(S))),
find_useless_states2(FA).
find_useless_states2(FA):- retract(utiles(S)),
not(visited(S)), assert(visited(S)),
forall((fa_move(FA,Y,S,_), not(visited(Y))),(asserta(utiles(Y)))),
find_useless_states2(FA).
find_useless_states2(_).
difference(L1, L2, R) :- intersection(L1, L2, I),
append(L1, L2, All),
subtract(All, I, R).
find_all_states_as_list(FA,L):- findall(X,fa_move(FA,X,_,_),M),findall(Y,fa_move(FA,_,Y,_),N),merge(M,N,LL),sort(LL,L).
find_useful_states_as_list(L):- findall(X,visited(X),L).
print_useless_states(FA):- find_all_states_as_list(FA,L),find_useful_states_as_list(M), difference(L,M,R), length(R,D),write(R),nl,write(D).
希望它可以帮助其他人。在stackoverflow中发布的问题中使用了一些代码构思。我感谢那些回答这些问题的人。
答案 1 :(得分:1)
可以将动态数据库用于所有这些事情,但很容易维护。我宁愿使用您的定义编译文件,因此避免手动执行assertz/1
。
uselessstate(Aut, Usl) :-
setof(S0, S^( closure0(adjacent(Aut), S0,S), fa_final(Aut,S) ), S0s),
setof(t, A^B^( adjacent(Aut, A,B), (Usl=A;Usl=B) ), _),
non_member(Usl, S0s).
unreachable(Aut, Usl) :-
setof(S, S0^( fa_start(Aut, S0), closure0(adjacent(Aut), S0,S) ), Ss),
setof(t, A^B^( adjacent(Aut, A,B), (Usl=A;Usl=B) ), _),
non_member(Usl, Ss).
definition of closure0/3
和non_member/2
位于另一个答案中。