lmntal / slim

slim LMNtal implementation
Other
18 stars 5 forks source link

nlmemに関するバグ #316

Closed kyawaway closed 7 months ago

kyawaway commented 10 months ago

以下のコードで再現可能:

{
 system_ruleset.
 inner@@ {s,$g[]} :- nlmem.kill({v,$g[]},trash).

 outer@@ {t,$g[]} :- {u,$g[]}.
 }.

 {{s},t. }.

入れ子の膜があり,内側にnlmemに反応する要素,外側に任意のルールが反応する要素があり,どちらを先に反応させても最終的に状態が合流するような構造を書いた時,

nlmemのルール(inner)を先に反応させると,nlmemが反応した膜を内側に持つ膜がルール(outer)に反応しなくなる.

生成される状態空間:

20231113bug1

本来は状態は合流する.

kyawaway commented 10 months ago

尚,膜内に

nlmem_kill@@
kill(M, T) :- unary(T) | '$callback'('nlmem_kill', M, T).

を記述すると,正常に動作する:

{
system_ruleset.
inner@@ {s,$g[]} :- kill({v,$g[]},trash).

outer@@ {t,$g[]} :- {u,$g[]}.

nlmem_kill@@
kill(M, T) :- unary(T) | '$callback'('nlmem_kill', M, T).
}.

{{s},t. }.

状態空間:

20231113bug2
tuesdayjz commented 7 months ago
{
   system_ruleset.
   inner@@ {s,$g[]} :- nlmem.kill({v,$g[]},trash).
   outer@@ {t,$g[]} :- {u,$g[]}.
 }.
 {{s},t. }.