📄 waltz.drl
字号:
<?xml version="1.0" encoding="UTF-8"?>
<!--
The Waltz Algorithm
-->
<rule-set name="Miss Manners"
xmlns="http://drools.org/rules"
xmlns:java="http://drools.org/semantics/java"
xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
xs:schemaLocation="http://drools.org/rules rules.xsd
http://drools.org/semantics/java java.xsd">
<import>org.drools.examples.benchmarks.waltz.WaltzUtil</import>
<import>org.drools.examples.benchmarks.waltz.WaltzWMEL</import>
<import>org.drools.examples.benchmarks.waltz.model.Edge</import>
<import>org.drools.examples.benchmarks.waltz.model.Junction</import>
<import>org.drools.examples.benchmarks.waltz.model.Line</import>
<import>org.drools.examples.benchmarks.waltz.model.Stage</import>
<!--
Our starting production. It checks to see if the start flag is in WM,
and if it is, it deletes it, and clears the screen.
Note: Use waltz0.dat instead.
-->
<rule name="begin">
<parameter identifier="stage"><class>Stage</class></parameter>
<java:condition>"start".equals( stage.getValue( ) )</java:condition>
<java:consequence>
System.out.println( "clr" );
drools.assertObject( new Line( 122, 107 ) );
drools.assertObject( new Line( 107, 2207 ) );
drools.assertObject( new Line( 2207, 3204 ) );
drools.assertObject( new Line( 3204, 6404 ) );
drools.assertObject( new Line( 2216, 2207 ) );
drools.assertObject( new Line( 3213, 3204 ) );
drools.assertObject( new Line( 2216, 3213 ) );
drools.assertObject( new Line( 107, 2601 ) );
drools.assertObject( new Line( 2601, 7401 ) );
drools.assertObject( new Line( 6404, 7401 ) );
drools.assertObject( new Line( 3213, 6413 ) );
drools.assertObject( new Line( 6413, 6404 ) );
drools.assertObject( new Line( 7416, 7401 ) );
drools.assertObject( new Line( 5216, 6413 ) );
drools.assertObject( new Line( 2216, 5216 ) );
drools.assertObject( new Line( 122, 5222 ) );
drools.assertObject( new Line( 5222, 7416 ) );
drools.assertObject( new Line( 5222, 5216 ) );
stage.setValue( "duplicate" );
drools.modifyObject( stage );
</java:consequence>
</rule>
<!--
If the duplicate flag is set, and there is still a line in WM, delete the
line and add two edges. One edge runs from p1 to p2 and the other runs from
p2 to p1. We then plot the edge.
-->
<rule name="reverse_edges">
<parameter identifier="stage"><class>Stage</class></parameter>
<parameter identifier="line"><class>Line</class></parameter>
<java:condition>"duplicate".equals( stage.getValue( ) )</java:condition>
<java:consequence>
int p1 = line.getP1( );
int p2 = line.getP2( );
System.out.println( "draw " + p1 + " " + p2 );
drools.assertObject( new Edge( p1, p2, false ) );
drools.assertObject( new Edge( p2, p1, false ) );
drools.retractObject( line );
</java:consequence>
</rule>
<!--
If the duplicating flag is set, and there are no more lines, then remove
the duplicating flag and set the make junctions flag.
-->
<rule name="done_reversing">
<parameter identifier="stage"><class>Stage</class></parameter>
<java:condition>"duplicate".equals( stage.getValue( ) )</java:condition>
<java:consequence>
if ( WaltzWMEL.lineExists( ) ) return;
stage.setValue( "detect_junctions" );
drools.modifyObject( stage );
</java:consequence>
</rule>
<!--
If three edges meet at a point and none of them have already been joined in
a junction, then make the corresponding type of junction and label the
edges joined. This production calls make-3_junction to determine
what type of junction it is based on the angles inscribed by the
intersecting edges
-->
<rule name="make-3_junction">
<parameter identifier="stage"><class>Stage</class></parameter>
<parameter identifier="edge1"><class>Edge</class></parameter>
<parameter identifier="edge2"><class>Edge</class></parameter>
<parameter identifier="edge3"><class>Edge</class></parameter>
<java:condition>"detect_junctions".equals( stage.getValue( ) )</java:condition>
<java:condition>edge1.getP1( ) == edge2.getP1( )</java:condition>
<java:condition>edge1.getP1( ) == edge3.getP1( )</java:condition>
<java:condition>edge1.getP2( ) != edge2.getP2( )</java:condition>
<java:condition>edge1.getP2( ) != edge3.getP2( )</java:condition>
<java:condition>edge2.getP2( ) != edge3.getP2( )</java:condition>
<java:condition>!edge1.isJoined( )</java:condition>
<java:condition>!edge2.isJoined( )</java:condition>
<java:condition>!edge3.isJoined( )</java:condition>
<java:consequence>
int basePoint = edge1.getP1( );
int p1 = edge1.getP2( );
int p2 = edge2.getP2( );
int p3 = edge3.getP2( );
drools.assertObject( WaltzUtil.make_3_junction( basePoint, p1, p2, p3 ) );
edge1.setJoined( true );
drools.modifyObject( edge1 );
edge2.setJoined( true );
drools.modifyObject( edge2 );
edge3.setJoined( true );
drools.modifyObject( edge3 );
</java:consequence>
</rule>
<!--
If two, and only two, edges meet that have not already been joined, then
the junction is an "L"
-->
<rule name="make_L">
<parameter identifier="stage"><class>Stage</class></parameter>
<parameter identifier="edge1"><class>Edge</class></parameter>
<parameter identifier="edge2"><class>Edge</class></parameter>
<java:condition>"detect_junctions".equals( stage.getValue( ) )</java:condition>
<java:condition>edge1.getP1( ) == edge2.getP1( )</java:condition>
<java:condition>edge1.getP2( ) != edge2.getP2( )</java:condition>
<java:condition>!edge1.isJoined( )</java:condition>
<java:condition>!edge2.isJoined( )</java:condition>
<java:consequence>
int basePoint = edge1.getP1( );
int p2 = edge1.getP2( );
int p3 = edge2.getP2( );
if ( WaltzWMEL.edgeExists( basePoint, p2, p3 ) ) return;
edge1.setJoined( true );
drools.modifyObject( edge1 );
edge2.setJoined( true );
drools.modifyObject( edge2 );
</java:consequence>
</rule>
<!--
If the detect junctions flag is set, and there are no more un_joined edges,
set the find_initial_boundary flag
-->
<rule name="done_detecting">
<parameter identifier="stage"><class>Stage</class></parameter>
<java:condition>"detect_junctions".equals( stage.getValue( ) )</java:condition>
<java:consequence>
if ( WaltzWMEL.joinedEdgeExists( ) ) return;
stage.setValue( "find_initial_boundary" );
drools.modifyObject( stage );
</java:consequence>
</rule>
<!--
If the initial boundary junction is an L, then we know its labelling
-->
<rule name="initial_boundary_junction_L">
<parameter identifier="stage"><class>Stage</class></parameter>
<parameter identifier="junction"><class>Junction</class></parameter>
<parameter identifier="edge1"><class>Edge</class></parameter>
<parameter identifier="edge2"><class>Edge</class></parameter>
<java:condition>"find_initial_boundary".equals( stage.getValue( ) )</java:condition>
<java:condition>"L".equals( junction.getType( ) )</java:condition>
<java:condition>junction.getBasePoint( ) == edge1.getP1( )</java:condition>
<java:condition>junction.getBasePoint( ) == edge2.getP1( )</java:condition>
<java:condition>junction.getP1( ) == edge1.getP2( )</java:condition>
<java:condition>junction.getP2( ) == edge2.getP2( )</java:condition>
<java:consequence>
if ( WaltzWMEL.greaterJunctionExists( junction.getBasePoint( ) ) ) return;
edge1.setLabel( "B" );
drools.modifyObject( edge1 );
edge2.setLabel( "B" );
drools.modifyObject( edge2 );
stage.setValue( "find_second_boundary" );
drools.modifyObject( stage );
</java:consequence>
</rule>
<!--
Ditto for an arrow
-->
<rule name="initial_boundary_junction_arrow">
<parameter identifier="stage"><class>Stage</class></parameter>
<parameter identifier="junction"><class>Junction</class></parameter>
<parameter identifier="edge1"><class>Edge</class></parameter>
<parameter identifier="edge2"><class>Edge</class></parameter>
<parameter identifier="edge3"><class>Edge</class></parameter>
<java:condition>"find_initial_boundary".equals( stage.getValue( ) )</java:condition>
<java:condition>"arrow".equals( junction.getType( ) )</java:condition>
<java:condition>junction.getBasePoint( ) == edge1.getP1( )</java:condition>
<java:condition>junction.getBasePoint( ) == edge2.getP1( )</java:condition>
<java:condition>junction.getBasePoint( ) == edge3.getP1( )</java:condition>
<java:condition>junction.getP1( ) == edge1.getP2( )</java:condition>
<java:condition>junction.getP2( ) == edge2.getP2( )</java:condition>
<java:condition>junction.getP3( ) == edge3.getP2( )</java:condition>
<java:consequence>
if ( WaltzWMEL.greaterJunctionExists( junction.getBasePoint( ) ) ) return;
edge1.setLabel( "B" );
drools.modifyObject( edge1 );
edge2.setLabel( "+" );
drools.modifyObject( edge2 );
edge3.setLabel( "B" );
drools.modifyObject( edge3 );
stage.setValue( "find_second_boundary" );
drools.modifyObject( stage );
</java:consequence>
</rule>
<!--
If we have already found the first boundary point, then find the second
boundary point, and label it.
-->
<rule name="second_boundary_junction_L">
<parameter identifier="stage"><class>Stage</class></parameter>
<parameter identifier="junction"><class>Junction</class></parameter>
<parameter identifier="edge1"><class>Edge</class></parameter>
<parameter identifier="edge2"><class>Edge</class></parameter>
<java:condition>"find_second_boundary".equals( stage.getValue( ) )</java:condition>
<java:condition>"L".equals( junction.getType( ) )</java:condition>
<java:condition>junction.getBasePoint( ) == edge1.getP1( )</java:condition>
<java:condition>junction.getBasePoint( ) == edge2.getP1( )</java:condition>
<java:condition>junction.getP1( ) == edge1.getP2( )</java:condition>
<java:condition>junction.getP2( ) == edge2.getP2( )</java:condition>
<java:consequence>
if ( WaltzWMEL.smallerJunctionExists( junction.getBasePoint( ) ) ) return;
edge1.setLabel( "B" );
drools.modifyObject( edge1 );
edge2.setLabel( "B" );
drools.modifyObject( edge2 );
stage.setValue( "labeling" );
drools.modifyObject( stage );
</java:consequence>
</rule>
<rule name="second_boundary_junction_arrow">
<parameter identifier="stage"><class>Stage</class></parameter>
<parameter identifier="junction"><class>Junction</class></parameter>
<parameter identifier="edge1"><class>Edge</class></parameter>
<parameter identifier="edge2"><class>Edge</class></parameter>
<parameter identifier="edge3"><class>Edge</class></parameter>
<java:condition>"find_second_boundary".equals( stage.getValue( ) )</java:condition>
<java:condition>"arrow".equals( junction.getType( ) )</java:condition>
<java:condition>junction.getBasePoint( ) == edge1.getP1( )</java:condition>
<java:condition>junction.getBasePoint( ) == edge2.getP1( )</java:condition>
<java:condition>junction.getBasePoint( ) == edge3.getP1( )</java:condition>
<java:condition>junction.getP1( ) == edge1.getP2( )</java:condition>
<java:condition>junction.getP2( ) == edge2.getP2( )</java:condition>
<java:condition>junction.getP3( ) == edge3.getP2( )</java:condition>
<java:consequence>
if ( WaltzWMEL.smallerJunctionExists( junction.getBasePoint( ) ) ) return;
edge1.setLabel( "B" );
drools.modifyObject( edge1 );
edge2.setLabel( "+" );
drools.modifyObject( edge2 );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -