gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 03:07:45 25 4
gpt4 key购买 nike

我收到一个作业,需要编写一个谓词“same_position(L1,L2,E1,E2)”,其中 L1 和 L2 是列表,E1 是 L1 中的元素,E2 是 L2 中的元素。当 E1 和 E2 在其列表中处于相同位置时,谓词为真。我需要使用递归来解决这个问题

这是我解决问题的方法:

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

这可以工作,但并不完全符合预期,随着作业的进行,出现了一个示例输出,其中以下部分是问题所在。预期输出在打印 false 之前给出 L 的值,而我的解决方案只是打印 false。我做错了什么?

预期输出:

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

矿井产量:

?- same_position(L,[a,a,c],3,a).
false.

最佳答案

罪魁祸首是:

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

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

@Term1 == @Term2

True if Term1 is equivalent to Term2. A variable is only identical to a sharing variable.

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

根据您的示例输出,您不想检查相等性,您想要统一,这就是 (=)/2 所做的:

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

然而,在 Prolog 中,我们也可以在 head 中进行 inify,方法是在 head 中使用 same 变量两次(或更多次):

same_position([L1|_],[L2|_]<b>, L1, L2</b>).
same_position([_|L1],[_|L2],E1,E2) :- same_position(L1,L2,E1,E2).

关于prolog - SWI-Prolog 检查不同列表中的两个元素是否位于同一位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52738849/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com