如何在有限状态机Prolog中找到无用状态

如何在有限状态机Prolog中找到无用状态,prolog,finite-automata,state-machine,Prolog,Finite Automata,State Machine,我一直在考虑一种解决方案,用于查找特定自动机中定义的所有无用状态,我知道一种方法是从开始状态开始移动,然后请求存储在Prolog谓词数据库中的以下状态。因为我正在学习Prolog,所以我没有很好地编写代码。我希望有人能帮我解决这个问题。我把我所有的留在这里 有限状态机结构。fau start->初始状态,fau move->从一个状态到另一个状态的有效移动,fau final->最终状态 % Start State :- assert(fa_start(fa_1, s_0)). % Final

我一直在考虑一种解决方案,用于查找特定自动机中定义的所有无用状态,我知道一种方法是从开始状态开始移动,然后请求存储在Prolog谓词数据库中的以下状态。因为我正在学习Prolog,所以我没有很好地编写代码。我希望有人能帮我解决这个问题。我把我所有的留在这里

有限状态机结构。fau start->初始状态,fau move->从一个状态到另一个状态的有效移动,fau 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)).
现在,这是我一直在写的代码。我们的想法是从
fau start
开始,然后使用有效的fau move继续移动,直到无法到达
fau 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,_).

提前感谢您的帮助。

我知道很难找到与我的具体问题相关的准确信息。我一直在努力,终于找到了一个解决方案,也许这不是最好的,但达成了协议。我把这个主意归功于你。如果你发现了虫子,欢迎你

现在,下面的代码打印出一个如上实现的有限状态自动机的无用状态

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中发布的问题中使用了一些代码思想。我感谢回答这些问题的人。

对于所有这些事情,使用动态数据库是可能的,但维护起来很困难。我宁愿使用您的定义编译该文件,从而避免手动执行
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).

非成员/2
可在另一个答案中找到。

您的具体问题是什么?请注意,
findall(l,相邻(fa,N,u),l)
可能有语法错误
l
是一个原子。此外,您对
fa_move
fa_start
的查询都引用了
fa
,但您的事实使用了
fa_1
。所以他们永远不会匹配。你好。谢谢你的留言。我想要的是打印所有无用的状态。而且,我已经在中阅读了算法,但我不知道如何调整它。谢谢你的回答。无用状态与不可达状态不同,但我正在研究一种解决方案,以寻求不可达状态。