Skip to content

CSLMNtalで、あるユーザ型定義が別のユーザ型定義を呼び出すとき落ちる #352

@ryoya-shirai

Description

@ryoya-shirai
typedef c_end(R2){
    c(R2) :- .
}.

typedef b_end(R1,R2){
    b(R1) :- c_end(R2).
}.

a(X1,X2), $t[X1,X2] :- b_end($t) | yes.
a(b,c).

上の例題では, typedef b_endのTypeRuleでtypedef c_endを用いた型検査を行う.
本例題はコンパイルは通るがセグフォする.

Segmentation fault (core dumped)

デバッガで追いかけた所, 型検査の箇所ではなく, グラフ書換えのremoveground命令の実行でセグフォしているっぽい.(以下中間命令列抜粋)

commit     ["_aX1X", 0]
newlist      [2]
getlink      [3, 1, 0]
addtolist      [2, 3]
getlink      [4, 1, 1]
addtolist      [2, 4]
removeatom     [1, 0]
removeground   [2, 0] ...ここ
newatom      [5, 0, 'yes'_0]
freeatom       [1]
freeground     [2]
proceed        []

なお, あるtypedefが別のtypedefを呼び出さないようなCSLMNtal例題でも, グラフ書換えで同様にremoveground命令が使用されるが, 実行に成功し正しい結果が得られている.

typedef connect(R1,R2){
    R1=R2.
}.

a(X1,X2), $t[X1,X2] :- connect($t) | b(X1,X2), $t[X1,X2].
a(X1,X1).
b(L0,L0).

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions