【发布时间】:2014-11-24 01:16:57
【问题描述】:
我一直在考虑一种解决方案来查找在特定自动机中定义的所有无用状态,并且我知道一种方法是从开始状态开始移动,然后请求以下状态,所有这些都存储在 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,_).
提前感谢您的所有帮助。
【问题讨论】:
-
您的具体问题是什么?请注意,
findall(l,adjacent(fa,N,_),L)可能存在语法错误。l是一个原子。此外,您对fa_move和fa_start的查询均引用fa,但您的事实使用fa_1。所以他们永远不会匹配。 -
你好。谢谢你的笔记。我想要的是打印所有无用的状态。
-
而且,我已经阅读了link 中的算法,但我不知道如何适应它。
标签: prolog finite-automata state-machine