lmntal-compiler
lmntal-compiler copied to clipboard
ルール左辺で、プロセス文脈と優先順位のためのカッコを併用するとパースできない
以下のコードをコンパイルすると
init($x) :- int($x) | (a($x), a($x)).
以下のエラーが出力される。
SYNTAX ERROR: illegal object in an atom argument: $x
SYNTAX ERROR: illegal object in an atom argument: $x
SYNTAX ERROR: rule with free variable: ~3, at line 1
SYNTAX ERROR: rule with free variable: ~4, at line 1
Compilation Failed
ちなみに、以下は問題なくコンパイルできる。
init :- (a(X), a(X)).
以下も、いずれも問題なくコンパイルできました。
init($x) :- int($x) | (a(X), a(Y)), $x[X], $x[Y]. init($x) :- int($x) | (a(X), a(Y), $x[X], $x[Y]). init($x) :- int($x) | a($x), a($x).
とりあえず実害はないと思うけど、ルール右辺を括る括弧が必要になることはあるかしら?
ルール右辺を括る括弧は必要ないと思います。下に示す、日誌に書いたプログラムで、局所リンクの名前が一意である必要をなくすには、どのように構文を変えればよいか考えている過程で、Issueに書いた事実を発見しました。詳しくは口頭で説明します。
init :-
v1(!P1), v2(!P2), v3(!P3), v4(!P4), v5(!P5), v6(!P6),
port(!P1, X1), port(!P2, X1),
port(!P1, X2), port(!P3, X2),
port(!P1, X3), port(!P4, X3),
port(!P2, X4), port(!P3, X4),
port(!P3, X5), port(!P6, X5),
port(!P4, X6), port(!P5, X6),
port(!P4, X7), port(!P6, X7),
port(!P5, X8), port(!P6, X8).
たしかに、ある部分構文木の中にリンク名が2回出現したらその構文木の局所リンクと みなすという流儀は考えられます。