state-machine - 这是 Prolog 中循环的良好实现吗?

标签 state-machine prolog

首先告诉大家,我是第一次在这里提问,如有不妥之处还请见谅。

我正在开发一个相当复杂的软件,它有一个实现 FSM 的 Prolog 核心。因为我不希望它(永远)停止,所以我正在尝试编写一个很好的类似循环的谓词,它可以使用 Prolog 的递归来工作。经过几次不成功的尝试(主要是因为堆栈问题)我最终得到了类似这样的东西:

/* Finite State Transition Network */
transition(st0,evnt0,st1).
transition(st1,evnt1,st2).
transition(st2,evnt2,st0).

fsm_state(state(st0),system(Energy,ActivePayloads),[]) :-
    /* ... */
    transition(st0,evnt0,NextState),
    !,
    fsm_state(state(NextState),system(Energy,ActivePayloads),[]).

fsm_state(state(st1),system(Energy,ActivePayloads),[]) :-
    /* ... */
    transition(st1,evnt1,NextState),
    !,
    fsm_state(state(NextState),system(Energy,ActivePayloads),[0,1,2]).

fsm_state(state(st2),system(Energy,ActivePayloads),[P|Params]) :-
    /* ... */
    transition(st2,evnt2,NextState),
    !,
    fsm_state(state(NextState),system(Energy,ActivePayloads),[]).

start :- 
    Sys = system(10,[]),
    fsm_state(state(s0),Sys,[]).

这是一个好方法吗?

最佳答案

首先是一般性的评论:你处理这个的方式是一种完全自然的 Prolog 方法,声明式的(好吧,或多或少,如果不是因为许多 !/0 阻止你在所有方向上使用谓词的话)描述连续状态之间的关系。这种关系自然是用递归谓词实现的。

令我感到奇怪的是,您需要这么多本质上看起来都一样的子句。为什么不能使用像这样的单个子句:

fsm(State0, System0, Params0) :-
    /* ... */
    transition(State0, Event, State),
    /* ... */
    fsm(State, System, Params).

其中可能有一些额外的目标将 Params0 与 Params、System0 与 System 以及其他一些实体相关联。一般的方法通常是在计算的单个“步骤”之前和之后的状态之间建立关系,以及描述一系列连续状态的另一个关系(由如上所述的单个子句组成)。

关于state-machine - 这是 Prolog 中循环的良好实现吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13688792/

相关文章:

prolog - 你如何在列表中找到丢失的号码?

prolog - `nth0/3` N 未绑定(bind)时的行为

perl - 帮助用 Perl 构建状态机的软件

java - 造成这两种不同值(value)观的原因是什么?

uml - UML 状态机图中的线程?

algorithm - 如何将公用电话建模为状态机?

prolog - 如何在Prolog中返回推荐列表?

haskell - 在一个循环中组合机器

prolog - 猜猜 Prolog 中的类似游戏

list - Prolog 中偶数之和、奇数乘积