首页 > 解决方案 > Prolog:测试 2 个列表的相似性

问题描述

如何检查两个不同列表的元素是否相等?没有,第一个和最后一个条目。不幸的是,我的方法不起作用,不幸的是我找不到我的错误。

isNearlyEqual(L1,L2) :-
    drop(L1,0,LA1),size(L1,X),drop(L1,X,LA1),
    drop(L2,0,LA2),size(L2,Y),drop(L2,Y,LA2),
    size(LA1,size1).
% My idea is now to check the 2 fragments of the list for equality. But I don't know how at the moment.
% First he removes the first and the last element.
% Then he should check the list for equality.
    
drop(Xs,N,Rs) :-
  integer(N),
  N > 0,
  drop(Xs,1,N,Rs).

drop( []     , _ , _ , [] ) .
drop( [X|Xs] , P , N , Rs ) :-
  ( 0 =:= P mod N -> R1 = Rs ; [X|R1] = Rs ) ,
  P1 is P+1 ,
  drop(Xs,P1,N,R1).
  
  
size([],0).

size([_|T],N):-
    size(T,M),
    N is M+1.

size_sub([],[]).

size_sub([H|T],[N|T2]):-
    size(H,N),
    size_sub(T,T2).

标签: prolog

解决方案


您定义了条件

    N > 0

在你的 drop/3 谓词中,但你也在尝试做

    drop(L1,0,LA1)

所以谓词总是假的

据我了解您的问题,请尝试此解决方案

    isNearlyEqual([_|T],[_|T2]) :-
        removeLast(T,L1),
        removeLast(T2,L2),
        completeEqual(L1, L2).

    completeEqual([],[]).
    completeEqual([H|T], [H2|T2]):-
        completeEqual(T,T2),
        H == H2.

    removeLast([_],[]).
    removeLast([H|[H2|T2]], Z):-
        removeLast([H2|T2],Z1),
        append([H],Z1,Z).

推荐阅读