【问题标题】:Finite State Automata in PrologProlog中的有限状态自动机
【发布时间】:2018-05-08 16:37:09
【问题描述】:

Prolog 中描述有限自动机的程序。它需要有 2 个参数列表,第一个包含输入(例如,[a,b,a,b,a]),另一个包含输出,它应该通过它已经通过的状态返回,按照箭头,例如 [1,3,2,4,5]

【问题讨论】:

  • 我想巧妙地提醒您,Stack Overflow 不是一项家庭作业服务。请向我们展示您的尝试以及您遇到的问题。如果您完全迷路了,我建议您先查阅教程,然后再尝试一下。
  • 我现在只有这个,我看过一些关于 Prolog 和 FSA 的教程。在这之后我知道我必须使用某种递归,有 1-2 个想法,但不会可能工作.f(1,b,1)。 f(1,a,2)。 f(2,a,3)。 f(2,b,4)。 f(4,a,5)。 f(3,b,2)。 f(3,a,5)。 f(5,a,3)。 f(5,b,1)。 f(4,b,1).

标签: prolog state-machine


【解决方案1】:

假设您使用谓词 f(StartState, EdgeLabel, EndState) 对有限状态自动机进行编码:

f(1,a,2).  f(1,b,1).
f(2,a,3).  f(2,b,4).
f(3,a,5).  f(3,b,2).
f(4,a,5).  f(4,b,1).
f(5,a,3).  f(5,b,1).

只需将查询链接到f/3,即可为固定的操作序列回答此问题:

?- X1=1, f(X1,a,X2), f(X2,b,X3), f(X3,a,X4), f(X4,b,X5), f(X5,a,X6), L=[X1,X2,X3,X4,X5,X6].
L = [1, 2, 4, 5, 1, 2] .

可以递归地回答对动作列表的相同查询。

基本步骤很简单:如果您从 Start 开始,并且不应用任何操作 ([]),则访问状态为 [Start]

walk(Start, [], [Start]).

如果你有一个动作序列和一个访问状态序列,从Start我们应用动作Input,我们到达状态State,然后递归地对剩余的动作Inputs做同样的事情其余状态States

walk(Start,[Input|Inputs],[Start|States]) :-
    f(Start,Input,State),
    walk(State, Inputs, States).

测试:

?- walk(1, [a,b,a,b,a], X).
X = [1, 2, 4, 5, 1, 2] ;
false.

【讨论】:

  • 非常感谢您使它如此易于理解。像魅力一样工作!
猜你喜欢
  • 1970-01-01
  • 2015-06-29
  • 2020-09-05
  • 1970-01-01
  • 2018-04-30
  • 1970-01-01
  • 2013-10-19
  • 1970-01-01
  • 2011-11-22
相关资源
最近更新 更多