SWI-Prolog检查不同列表中的两个元素是否在同一位置

时间:2018-10-10 11:07:58

标签: prolog

我得到一个作业,需要编写谓词“ same_position(L1,L2,E1,E2)”,其中L1和L2是列表,E1是L1的元素,E2是L2的元素。当E1和E2在其列表中的相同位置时,谓词为true。 我需要使用递归

解决此问题

这是我对问题的解决方案:

<?xml version="1.0" encoding="utf-8"?>
<odoo>
  <data>
    <record model="ir.module.category" id="module_management">
      <field name="name">Demo module access</field>
      <field name="description">User access level for this module</field>
      <field name="sequence">3</field>
    </record>

   <record id="group_user" model="res.groups">
     <field name="name">User</field>
     <field name="implied_ids" eval="[(4, ref('base.group_user'))]"/>
     <field name="users" eval="[(4, ref('base.user_root'))]"/>
     <field name="category_id" ref="simcard.module_management"/>
    </record>

    <record id="group_manager" model="res.groups">
      <field name="name">Manager</field>
      <field name="implied_ids" eval="[(4, ref('simcard.group_user'))]"/>
      <field name="category_id" ref="simcard.module_management"/>
    </record>
  </data>
</odoo>

这是有效的,但并不完全如预期的那样,伴随分配的是一个示例输出,其中以下部分是问题所在。期望的输出在打印为false之前给出L的值,而我的解决方案只是打印为false。我在做什么错了?

预期输出:

same_position([L1|_],[L2|_],E1,E2) :- L1==E1,L2==E2.
same_position([_|L1],[_|L2],E1,E2) :- same_position(L1,L2,E1,E2).

矿山输出:

?- same_position(L, [a,a,c], 3, a).
L = [3|_G1667] ;
L = [_G1769, 3|_G1772] ;
false.

1 个答案:

答案 0 :(得分:1)

罪魁祸首是:

same_position([L1|_],[L2|_],E1,E2) :- L1==E1, L2==E2.
same_position([_|L1],[_|L2],E1,E2) :- same_position(L1,L2,E1,E2).

(==)/2 [swi-doc]谓词定义为:

  

@Term1 == @Term2

     

True,如果Term1等效于Term2变量仅与共享变量相同

因此,这意味着对于变量X,只有X == X成立,而不是X == Y(除非X = Y)成立,并且X == 3总是失败(除非{ {1}}已经接地X)。

但是,基于示例输出,您不想检查相等性,而是想统一3就是这样做的

(=)/2

但是,在Prolog中,我们也可以通过在头部两次(或多次)使用 same 变量来在 head 中进行提示:

same_position([L1|_],[L2|_],E1,E2) :- L1 = E1, L2 = E2.
same_position([_|L1],[_|L2],E1,E2) :- same_position(L1,L2,E1,E2).