Search code examples
aiml

AIML how to check if the input string matches one from a map


I am trying to compare if the user's input matches the expected answer in AIML. I found this code that works well when the value is true but, for some reason I can't understand, fails when the match is false (there is no match for the and goes to UDC). If it worked, I could easily replace the second * with my maps result.

From: https://github.com/pandorabots/aiml-utilities/blob/master/lib/aimlstandardlibrary.aiml

<!-- STRING EQUALS-->
<category>
    <pattern>XEQ * XS *</pattern>
    <template>
        <learn>
            <category>
                <pattern>
                    <eval>
                        <uppercase>XFALSE <star/></uppercase>
                    </eval>
                </pattern>
                <template>TRUE</template>
            </category>
        </learn>
        <srai>XFALSE <star index="2"/></srai>
        <learn>
            <category>
                <pattern>
                    <eval>
                        <uppercase>XFALSE <star/></uppercase>
                    </eval>
                </pattern>
                <template>FALSE</template>
            </category>
        </learn>
    </template>
</category>

Does anyone have a better way to do it? Thanks a lot.


Solution

  • Did you include the entire library AIML file? You need this category for it to work (it's at the top of the file):

    <category>
      <pattern>
      XFALSE *
      </pattern>
      <template>FALSE</template>
    </category>
    

    Without it, the UDC will be called. A more efficient method would be to use the condition tag. This removes the need to use the <learn> tag to set up extra categories:

    <category>
        <pattern>XEQ * XS *</pattern>
        <template>
            <think>
                <set name="value1"><star/></set>
                <set name="value2"><star index="2"/></set>
            </think>
            <condition name="value1">
                <li><value><get name="value2"/></value>TRUE</li>
                <li>FALSE</li>
            </condition>
        </template>
    </category>