首先,让我告诉你,这恰好是我第一次在这里问一些事情,所以如果这不是正确的地方,请原谅我。
我正在开发一个相当复杂的软件,其中Prolog核心实现了FSM。因为我不希望它停止(永远),我正在尝试编写一个类似循环的谓词,它可以使用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,[]).
这是一个好方法吗?
答案 0 :(得分:2)
首先是一般性评论:你对此的看法是完全自然的Prolog方法,声明性地(好吧,或多或少,如果它不是为了阻止你在所有方向使用谓词的许多!/ 0)描述连续状态之间的关系。这种关系自然是用递归谓词实现的。
令我感到奇怪的是,你需要这么多条款,这些条款在本质上看起来都是一样的。为什么不能使用像:
这样的单个子句fsm(State0, System0, Params0) :-
/* ... */
transition(State0, Event, State),
/* ... */
fsm(State, System, Params).
其中可能有一些额外的目标将Params0与Params,System0与System以及其他一些实体相关联。通常的方法通常是在计算的单个“步骤”之前和之后建立状态之间的关系,以及描述连续状态序列的另一个关系(由上面的单个子句组成)。