3

まず最初に、たまたまここで質問するのはこれが初めてなので、適切な場所でない場合はご容赦ください。

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,[]).

これは良いアプローチですか?

4

1 に答える 1

2

最初に一般的な注意: これを行う方法は、完全に自然な Prolog アプローチであり、宣言的に (多かれ少なかれ、述語をすべての方向で使用することを妨げる多くの !/0 がなければ) 関係を記述します。連続する状態の間。この関係は当然、再帰述語で実装されます。

私が奇妙に感じるのは、本質的にはすべてが同じように見える非常に多くの節が必要だということです。次のような単一の句を使用できないのはなぜですか。

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

ここで、いくつかの追加の目標は、Params0 を Params に関連付け、System0 を System に関連付け、その他のエンティティに関連付ける可能性があります。一般的な方法は、通常、計算の単一の「ステップ」の前後の状態間の関係と、一連の連続した状態を記述する別の関係 (上記のような単一の節で構成される) を持つことです。

于 2012-12-03T21:11:15.840 に答える