AIML <condition> 循环的主体无法在 Pandorabots 中执行

Posted

技术标签:

【中文标题】AIML <condition> 循环的主体无法在 Pandorabots 中执行【英文标题】:Body of AIML <condition> loop fails to execute in Pandorabots 【发布时间】:2022-01-16 13:11:22 【问题描述】:

我正在尝试在最新的 Windows 11 上通过 MS Edge 在 Pandorabots 和 the standard library 中使用 AIML 循环遍历列表。

以下所有代码都出现在相同的&lt;think&gt; 标记中。

在此之前还有另一个循环。这两个循环在功能上是相同的。每个循环引用一个不同的从零开始的索引映射到谓词名称,以便将所有谓词值设置为“未知”。

唯一的区别是两个地图文件;它们之间的唯一区别是大小写和(微不足道的)字符串长度,它们都可以在其他上下文中使用:

[["0", "HI"], ["1", "BY"], ["2", "OK"], [ ... ]][["0", "hello"], ["1", "byenow"], ["2", "okay"], [ ... ]]

所以第一个循环有效,但是这个循环显然什么都不做:

<set var="i">0</set>
<set var="allreset">FALSE</set>
<condition var="allreset" value="FALSE">

    <!-- reset predicate -->
    <set><name><map name="thingsdict"><get var="i" /></map></name>
        unknown
    </set>

    <!-- increment and check for OOR -->
    <set var="i"><map name="successor"><get var="i" /></map></set>
    <set var="allreset">
        <srai>XEQ <map name="thingsdict"><get var="i" /></map> XS unknown</srai>
    </set>
    <loop />
</condition>

这是上一个循环,正确运行的循环:

<set var="i">0</set>
<set var="allreset">FALSE</set>
<condition var="allreset" value="FALSE">

    <!-- reset predicate -->
    <set><name><map name="otherthingsdict"><get var="i" /></map></name>
        unknown
    </set>

    <!-- increment and check for OOR -->
    <set var="i"><map name="successor"><get var="i" /></map></set>
    <set var="allreset">
        <srai>XEQ <map name="otherthingsdict"><get var="i" /></map> XS unknown</srai>
    </set>
    <loop />
</condition>

字面意思是一样的,不是吗?

编辑:完整类别(带有注释标记以进行调试):

<category>
    <pattern>5</pattern>
    <template>
        Starting over...
        <br/><br/>
        <!--<think>-->
            <set name="mode">unknown</set>
            <set name="score">unknown</set>
            <set name="ties">unknown</set>
            <set name="tiecount">unknown</set>
            
            <!-- loop through first map of related predicates -->
            <set var="i">0</set>
            <set var="allreset">FALSE</set>
            <condition var="allreset" value="FALSE">
                <map name="thingsdict"><get var="i" /></map>
                <set><name><map name="thingsdict"><get var="i" /></map></name>
                    unknown
                </set>
                <set var="i"><map name="successor"><get var="i" /></map></set>
                <set var="allreset">
                    <srai>XEQ <map name="thingsdict"><get var="i" /></map> XS unknown</srai>
                </set>
                <loop />
            </condition>
            
            <!-- loop through other related predicates -->
            <set var="i">0</set>
            <set var="allreset">FALSE</set>
            <condition var="allreset" value="FALSE">
                <map name="otherthingsdict"><get var="i" /></map>
                <set><name><map name="otherthingsdict"><get var="i" /></map></name>
                    unknown
                </set>
                <set var="i"><map name="successor"><get var="i" /></map></set>
                <set var="allreset">
                    <srai>XEQ <map name="otherthingsdict"><get var="i" /></map> XS unknown</srai>
                </set>
                <loop />
            </condition>
        <!--</think>-->
        All values erased!
        <br/><br/>
        <srai>HI</srai>
    </template>
</category>

提前感谢您的帮助!

【问题讨论】:

如果唯一不同的是地图,你能至少张贴每张地图的样本吗?如果将“otherthingsdict”复制到“thingsdict”会发生什么?现在这会让你的循环工作吗? 它们之间的唯一区别是大小写,它们都适用于其他上下文。 [["0", "HI"], ["1", "BY"], ["2", "OK"], [ ... ]][["0", "hello"], ["1", "byenow"], ["2", "okay"], [ ... ]] 问题似乎出在条件循环上。例如,如果我注释掉 think 标签并在任一条件标签之前放置 &lt;map name="thingsindex"&gt;&lt;get var="i" /&gt;&lt;/map&gt;(或 "otherthingsindex"),那么它将正确打印给用户。但如果它在条件标签内,则不是。除此之外,只有后面的条件标签的内容似乎根本没有执行。 这对我来说很好用。我在一个空白的机器人中尝试过。您能否发布完整的类别,而不仅仅是循环部分。 完成! @SteveWorswick 这对我来说很好,所有谓词都设置为“未知”。您是否还希望用户看到它们都被重置的显示? 【参考方案1】:

任何&lt;loop/&gt; 标记必须出现在&lt;li&gt; 标记内。确保包含一组 &lt;li&gt; 标签,但不包含 &lt;loop/&gt; 元素;这些可以为空,也可以不为空。

【讨论】:

以上是关于AIML <condition> 循环的主体无法在 Pandorabots 中执行的主要内容,如果未能解决你的问题,请参考以下文章

136-for循环

mybatis循环map的一些技巧

利用条件变量和互斥量循环打印ABC和1-100的错误情况

用 AIML 开发人工智能聊天机器人

智能客服 对话实现--python aiml包

Lua学习五----------Lua循环