【问题标题】:Compare the first item of a list with the last one of another list in prolog将列表的第一项与序言中另一个列表的最后一项进行比较
【发布时间】:2015-11-25 18:16:24
【问题描述】:

我正在尝试比较两个不同的列表,但是当列表的第一项和最后一项相等时,比较必须成功,反之亦然,而列表的其他项必须相等。

所以事情一定是这样的

cmp([a,b,c,d,e],[e,b,c,d,a]).
true.

使用以下代码,我们成功了,但仅使用了列表的前两项:

swap([X,Y],[Y,X]).
swap([X,Y|T],[Y,X|Z]):- T=Z.

有什么想法吗?

【问题讨论】:

    标签: list prolog compare swap


    【解决方案1】:

    我喜欢 @gusbro 提出的 append/3 方法 (+1)。另一种方法是使用带有您想要的元素的辅助谓词。这是swapping the first and last elements of a list问题的一个小变种。

    cmp([A|As], [B|Bs]) :-
        cmp(As, A, B, Bs).
    
    cmp([A], B, A, [B]).
    cmp([_, A|As], X, Y, [_, B|Bs]) :-
        cmp([A|As], X, Y, [B|Bs]).
    
    | ?- cmp([a,b,c,d,e],[e,b,c,d,a]).
    
    true ? a
    
    no
    | ?- cmp(A, B).
    
    A = [C,D]
    B = [D,C] ? ;
    
    A = [C,_,D]
    B = [D,_,C] ? ;
    
    A = [C,_,_,D]
    B = [D,_,_,C] ? ;
    
    A = [C,_,_,_,D]
    B = [D,_,_,_,C] ? ;
    ...
    

    【讨论】:

      【解决方案2】:

      我会使用append/3 来获取第一个和最后一个项目,并在这些项目互换的情况下再次使用它:

      cmp(A, B):-
        append([First|Tail], [Last], A),
        append([Last|Tail], [First], B).
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-03
        • 1970-01-01
        • 1970-01-01
        • 2020-06-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多