我得到一个作业,需要编写谓词“ 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.
答案 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).