0

我的规则应该将第一个参数与列表中的第三个元素统一起来。该列表是规则中的第二个参数。如果没有第三个元素,这应该会失败。

经过许多示例和混淆后,我创建了此规则。

third(X,[_|T]):-
    [_,Y] = T,!,fail,
    (Y,X).

所以我的理解,我认为是不正确的,它将 Y 设置为列表 T 的第三个元素,因为 T 是初始列表的尾部。然后它将 Y 与 X 统一。

仍然对“统一”这些元素的代码感到困惑

4

1 回答 1

2

fail切割后!确保您的程序永远不会成功,因为您正在通过切割做出选择然后失败。

仅当列表恰好具有三个元素时,您才可以尝试访问列表的第三个元素:跳过过程头部的第一个元素,然后从尾部获取第二个元素。

third(X,[_|T]):-
    [_,X] = T.

请注意,如果列表不包含恰好三个元素,则此过程将失败。

但是,直接访问过程头部的第三个元素更直接,例如:

third(X, [_, _, X|_]).

这会将 X 与来自第二个参数的列表的第三个元素统一起来。该|_部分允许列表具有更多元素(它将尾部与匿名变量统一)。

于 2012-10-23T17:27:29.330 回答