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

ルール左辺で、プロセス文脈と優先順位のためのカッコを併用するとパースできない

Open avtomat2023 opened this issue 9 years ago • 3 comments

以下のコードをコンパイルすると

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)).

avtomat2023 avatar May 22 '15 16:05 avtomat2023

以下も、いずれも問題なくコンパイルできました。

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).

とりあえず実害はないと思うけど、ルール右辺を括る括弧が必要になることはあるかしら?

k-ueda avatar May 22 '15 20:05 k-ueda

ルール右辺を括る括弧は必要ないと思います。下に示す、日誌に書いたプログラムで、局所リンクの名前が一意である必要をなくすには、どのように構文を変えればよいか考えている過程で、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).

avtomat2023 avatar May 23 '15 00:05 avtomat2023

たしかに、ある部分構文木の中にリンク名が2回出現したらその構文木の局所リンクと みなすという流儀は考えられます。

k-ueda avatar May 27 '15 14:05 k-ueda