lmntal-compiler icon indicating copy to clipboard operation
lmntal-compiler copied to clipboard

ガード・ボディ命令列移動時の無駄なリンク列の再取得

Open 8q opened this issue 5 years ago • 1 comments

以下の例の場合、aアトムから辿れるgroundのリンクをcommit前とcommit後で2度取り直しているが、2度目は必要ない。Optimizer等で打ち消すようにする。

╰─ echo 'a(X) :-  ground(X) | b(X)' | lmntal --slimcode --stdin-lmn -O3
...
Compiled Ruleset @601
Compiled Rule
...
	--memmatch:
		spec           [1, 14]
		findatom     [1, 0, 'a'_1]
		getlink      [2, 1, 0]
		newlist      [3]
		addtolist      [3, 2]
		newlist      [4]
		isground     [5, 3, 4]
		commit         ["_aXgr", 0]
		newlist      [6]
		getlink      [7, 1, 0]
		addtolist      [6, 7]
		removeatom     [1, 0, 'a'_1]
		removeground   [6, 0]
...

8q avatar Feb 11 '20 05:02 8q

ガード・ボディ命令列がヘッド命令列に移動させないときは打ち消さない。以下の場合は2度出るのは問題ない。

╰─ echo 'a(X) :-  ground(X) | b(X)' | lmntal --slimcode --stdin-lmn
...
Compiled Ruleset @601
Compiled Rule
...
	--guard:L114:
		spec           [2, 6]
		getlink      [2, 1, 0]
		newlist      [3]
		addtolist      [3, 2]
		newlist      [4]
		isground     [5, 3, 4]
		jump           [L103, [0], [1], []]
	--body:L103:
		spec           [2, 10]
		commit         ["_aXgr", 0]
		newlist      [2]
		getlink      [3, 1, 0]
		addtolist      [2, 3]
		removeatom     [1, 0, 'a'_1]
		removeground   [2, 0]
...

8q avatar Feb 11 '20 05:02 8q