Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
306 changes: 306 additions & 0 deletions log.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,306 @@
{
"parent" : null,
"stable" : false,
"kind" : 0,
"pragmaAtHost" : null,
"name" : null,
"atoms" : [ ],
"mems" : [ ],
"rules" : [ {
"name" : "_init",
"fSuppressEmptyHeadWarning" : false,
"leftMem" : {
"parent" : null,
"stable" : false,
"kind" : 0,
"pragmaAtHost" : null,
"name" : null,
"atoms" : [ ],
"mems" : [ ],
"rules" : [ ],
"aggregates" : [ ],
"processContexts" : [ ],
"ruleContexts" : [ ],
"typedProcessContexts" : [ ],
"freeLinks" : { },
"rulesets" : [ ],
"normalAtomCount" : 0,
"freeLinkAtomCount" : 0,
"firstAtomName" : "null"
},
"rightMem" : {
"parent" : null,
"stable" : false,
"kind" : 0,
"pragmaAtHost" : null,
"name" : null,
"atoms" : [ {
"args" : [ {
"name" : "~1",
"pos" : 0,
"informativeText" : "_1(a/1,0)"
} ],
"line" : 1,
"column" : 1,
"functor" : {
"name" : "a",
"arity" : 1,
"path" : null,
"integer" : false,
"string" : false,
"quotedAtomName" : "a",
"active" : true,
"number" : false,
"symbol" : true,
"insideProxy" : false,
"outsideProxy" : false,
"value" : "a",
"quotedFullyFunctorName" : "a",
"quotedFunctorName" : "a",
"quotedFullyAtomName" : "a"
},
"isSelfEvaluated" : false
}, {
"args" : [ {
"name" : "~1",
"pos" : 0,
"informativeText" : "_1(b/1,0)"
} ],
"line" : 1,
"column" : 3,
"functor" : {
"name" : "b",
"arity" : 1,
"path" : null,
"integer" : false,
"string" : false,
"quotedAtomName" : "b",
"active" : true,
"number" : false,
"symbol" : true,
"insideProxy" : false,
"outsideProxy" : false,
"value" : "b",
"quotedFullyFunctorName" : "b",
"quotedFunctorName" : "b",
"quotedFullyAtomName" : "b"
},
"isSelfEvaluated" : false
} ],
"mems" : [ ],
"rules" : [ {
"name" : null,
"fSuppressEmptyHeadWarning" : false,
"leftMem" : {
"parent" : null,
"stable" : false,
"kind" : 0,
"pragmaAtHost" : null,
"name" : null,
"atoms" : [ {
"args" : [ {
"name" : "X",
"pos" : 0,
"informativeText" : "X(a/1,0)"
} ],
"line" : 1,
"column" : 7,
"functor" : {
"name" : "a",
"arity" : 1,
"path" : null,
"integer" : false,
"string" : false,
"quotedAtomName" : "a",
"active" : true,
"number" : false,
"symbol" : true,
"insideProxy" : false,
"outsideProxy" : false,
"value" : "a",
"quotedFullyFunctorName" : "a",
"quotedFunctorName" : "a",
"quotedFullyAtomName" : "a"
},
"isSelfEvaluated" : false
} ],
"mems" : [ ],
"rules" : [ ],
"aggregates" : [ ],
"processContexts" : [ ],
"ruleContexts" : [ ],
"typedProcessContexts" : [ ],
"freeLinks" : {
"X" : {
"name" : "X",
"pos" : 0,
"informativeText" : "X(a/1,0)"
}
},
"rulesets" : [ ],
"normalAtomCount" : 1,
"freeLinkAtomCount" : 0,
"firstAtomName" : "a"
},
"rightMem" : {
"parent" : null,
"stable" : false,
"kind" : 0,
"pragmaAtHost" : null,
"name" : null,
"atoms" : [ {
"args" : [ {
"name" : "X",
"pos" : 0,
"informativeText" : "X(b/1,0)"
} ],
"line" : 1,
"column" : 15,
"functor" : {
"name" : "b",
"arity" : 1,
"path" : null,
"integer" : false,
"string" : false,
"quotedAtomName" : "b",
"active" : true,
"number" : false,
"symbol" : true,
"insideProxy" : false,
"outsideProxy" : false,
"value" : "b",
"quotedFullyFunctorName" : "b",
"quotedFunctorName" : "b",
"quotedFullyAtomName" : "b"
},
"isSelfEvaluated" : false
} ],
"mems" : [ ],
"rules" : [ ],
"aggregates" : [ ],
"processContexts" : [ ],
"ruleContexts" : [ ],
"typedProcessContexts" : [ ],
"freeLinks" : {
"X" : {
"name" : "X",
"pos" : 0,
"informativeText" : "X(b/1,0)"
}
},
"rulesets" : [ ],
"normalAtomCount" : 1,
"freeLinkAtomCount" : 0,
"firstAtomName" : "b"
},
"guardMem" : {
"parent" : null,
"stable" : false,
"kind" : 0,
"pragmaAtHost" : null,
"name" : null,
"atoms" : [ ],
"mems" : [ ],
"rules" : [ ],
"aggregates" : [ ],
"processContexts" : [ ],
"ruleContexts" : [ ],
"typedProcessContexts" : [ ],
"freeLinks" : { },
"rulesets" : [ ],
"normalAtomCount" : 0,
"freeLinkAtomCount" : 0,
"firstAtomName" : "null"
},
"guardNegatives" : [ ],
"processContexts" : { },
"ruleContexts" : { },
"typedProcessContexts" : { },
"lineno" : 1,
"initialRule" : false
} ],
"aggregates" : [ ],
"processContexts" : [ ],
"ruleContexts" : [ ],
"typedProcessContexts" : [ ],
"freeLinks" : { },
"rulesets" : [ ],
"normalAtomCount" : 2,
"freeLinkAtomCount" : 0,
"firstAtomName" : "a"
},
"guardMem" : {
"parent" : null,
"stable" : false,
"kind" : 0,
"pragmaAtHost" : null,
"name" : null,
"atoms" : [ ],
"mems" : [ ],
"rules" : [ ],
"aggregates" : [ ],
"processContexts" : [ ],
"ruleContexts" : [ ],
"typedProcessContexts" : [ ],
"freeLinks" : { },
"rulesets" : [ ],
"normalAtomCount" : 0,
"freeLinkAtomCount" : 0,
"firstAtomName" : "null"
},
"guardNegatives" : [ ],
"processContexts" : { },
"ruleContexts" : { },
"typedProcessContexts" : { },
"lineno" : 1,
"initialRule" : false
} ],
"aggregates" : [ ],
"processContexts" : [ ],
"ruleContexts" : [ ],
"typedProcessContexts" : [ ],
"freeLinks" : { },
"rulesets" : [ ],
"normalAtomCount" : 0,
"freeLinkAtomCount" : 0,
"firstAtomName" : "null"
}
Compiled Ruleset @602
Compiled Rule
--atommatch:
--memmatch:
spec [1, 1]
jump [L106, [0], [], []]
--guard:L106:
spec [1, 1]
jump [L107, [0], [], []]
--body:L107:
spec [1, 3]
commit ["_init", 0]
loadruleset [0, @601]
newatom [1, 0, 'a'_1]
newatom [2, 0, 'b'_1]
newlink [1, 0, 2, 0, 0]
proceed []


Compiled Ruleset @601
Compiled Rule
--atommatch:
--memmatch:
spec [1, 2]
findatom [1, 0, 'a'_1]
jump [L101, [0], [1], []]
--guard:L101:
spec [2, 2]
jump [L102, [0], [1], []]
--body:L102:
spec [2, 3]
commit ["_aXbX", 0]
removeatom [1, 0]
newatom [2, 0, 'b'_1]
relink [2, 0, 1, 0, 0]
freeatom [1]
proceed []


21 changes: 13 additions & 8 deletions src/compile/Optimizer.java
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ public static void setLevel(int level) {
*
* @param rule ルールオブジェクト
*/
public static void optimizeRule(Rule rule) {
public static void optimizeRule(Rule rule, boolean isOrRule) {
// TODO 最適化器を統合する
Compactor.compactRule(rule);
// TODO 本質的にインライン展開が必要ないものは、展開しなくてもできるようにする
Expand All @@ -80,15 +80,15 @@ public static void optimizeRule(Rule rule) {
// allocatomReduce のために常に head と guard をくっつける
if (true) {
// head と guard をくっつける
inlineExpandTailJump(rule.memMatch);
inlineExpandTailJump(rule.memMatch, isOrRule);
rule.guardLabel = null;
rule.guard = null;
}
if (rule.isTypeDef) {
rule.memMatch.remove(rule.memMatch.size() - 1);
}
optimize(rule.memMatch, rule.body);
if (fGuardMove) {
if (fGuardMove && !isOrRule) {
guardMove(rule.memMatch);
allocMove(rule.memMatch);
}
Expand All @@ -101,7 +101,8 @@ public static void optimizeRule(Rule rule) {
if (fSystemRulesetsInlining) inlineExpandSystemRuleSets(rule.body);
if (fInlining) {
// head(+guard) と body をくっつける
inlineExpandTailJump(rule.memMatch);
// guard or に対応するため、head と guard の切れ目に印をつけるように変更
inlineExpandTailJump(rule.memMatch, false);

rule.bodyLabel = null;
rule.body = null;
Expand Down Expand Up @@ -139,20 +140,20 @@ public static void optimize(List<Instruction> head, List<Instruction> body) {
* [ spec[X,Y]; C;jump[L,A1..Am] ] where L:[spec[m,m+n];D]
* ==> [ spec[X,Y+n];C; D{ 1..m->A1..Am, m+1..m+n->Y+1..Y+n } ]
* }</pre> */
public static void inlineExpandTailJump(List<Instruction> insts) {
public static void inlineExpandTailJump(List<Instruction> insts, boolean isOrRule) {
if (insts.isEmpty()) return;
Instruction spec = insts.get(0);
if (spec.getKind() != Instruction.SPEC) return;
for (int i = 1; i < insts.size(); i++) {
Instruction branch = insts.get(i);
if (branch.getKind() != Instruction.BRANCH) break;
InstructionList label = (InstructionList) branch.getArg1();
inlineExpandTailJump(label.insts);
inlineExpandTailJump(label.insts, isOrRule);
}

int formals = spec.getIntArg1();
int locals = spec.getIntArg2();
locals = inlineExpandTailJump(insts, locals);
locals = inlineExpandTailJump(insts, locals, isOrRule);
spec.updateSpec(formals, locals);
}

Expand All @@ -161,7 +162,7 @@ public static void inlineExpandTailJump(List<Instruction> insts) {
* @param varcount 展開前の実引数
* @return 展開後の実引数
* */
public static int inlineExpandTailJump(List<Instruction> insts, int varcount) {
public static int inlineExpandTailJump(List<Instruction> insts, int varcount, boolean isOrRule) {
if (insts.isEmpty()) return varcount;
int size = insts.size();
Instruction jump = insts.get(size - 1);
Expand All @@ -188,6 +189,10 @@ public static int inlineExpandTailJump(List<Instruction> insts, int varcount) {
Instruction.applyVarRewriteMap(subinsts, map);
subinsts.remove(0); // specを除去
insts.remove(size - 1); // jump命令を除去
if (isOrRule) { // guard or 用の dummy を追加
Instruction dummy = new Instruction(Instruction.ORDUMMY);
insts.add(dummy);
}
insts.addAll(subinsts);
return varcount;
}
Expand Down
Loading