lmntal / slim

slim LMNtal implementation
Other
18 stars 5 forks source link

膜内外にリンクを含まない初期グラフを置いた場合に、グラフが正しく表示されない不具合 #280

Closed k-yamada39 closed 1 year ago

k-yamada39 commented 2 years ago

以下のプログラムのように、膜の内外にリンクを含まないアトムのみを置いた状態で、--ndオプションと--use-builtin-rule を付けて実行すると、出力される結果にそれらのアトムが表示されないことがあります。 アトムの他にルールを書いた場合、そのルールの発火などは問題なく起きているようなので、表示上の問題と思われます。 { test. }. test.

sano-jin commented 1 year ago

再現

stiilton 上で test.lmn を

{ test. }. test.

として,

slim -t --nd --use-builtin-rule test.lmn

とすると,

States
1::{{}. }

Transitions
init:1
1::

'# of States'(stored)   = 1.
'# of States'(end)      = 1.

となる.

備考

slim --dump-json -t --nd --use-builtin-rule test.lmn

のように,json を dump する形式であれば下記のようにきちんと出力される.

States
1::{"id":5,"name":"","atoms":[{"id":6,"name":"test","links":[]}],"membranes":[{"id":7,"name":"","atoms":[{"id":8,"name":"test","links":[]}],"membranes":[]}]}

Transitions
init:1
1::

'# of States'(stored)   = 1.
'# of States'(end)      = 1.
sano-jin commented 1 year ago
a. {b }.

でも同様の結果になる.

adzukimame commented 1 year ago

dumpの形式を指定しない場合,lmn_dump_cell_internal()内の以下の部分 https://github.com/lmntal/slim/blob/c3c95f9ae2c0de5e9e9eb119caafc53ee559f716/src/vm/dumper.cpp#L637-L640record_flagが0以外の値になっているため,出力から省かれているようです。LmnSymbolAtom構造体の定義では, https://github.com/lmntal/slim/blob/c3c95f9ae2c0de5e9e9eb119caafc53ee559f716/src/vm/atom.h#L137-L142 のようにfalseで初期化されています。alloc.cpphttps://github.com/lmntal/slim/blob/c3c95f9ae2c0de5e9e9eb119caafc53ee559f716/src/element/alloc.cpp#L64-L78 のように,ヒープからメモリ領域を割り当てたときにrecord_flagを初期化していないために,問題が発生しているのかもしれません。 JSONでdumpする場合,lmn_dump_cell_internal()の代わりにlmn_dump_mem_json()が呼ばれていて,こちらではrecord_flagは参照していないようです。

adzukimame commented 1 year ago

lmn_new_atom()のreturn文の前にap->record_flag = false;と付け足すと,とりあえずはきちんと出力されるようになりました。

imaren commented 1 year ago

上で議論されている解決方法を実装しました.