⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 waltz.drl

📁 drools 一个开放源码的规则引擎
💻 DRL
📖 第 1 页 / 共 3 页
字号:
<?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 + -