Prolog 序言:测试2个列表的相似性

Prolog 序言:测试2个列表的相似性,prolog,Prolog,如何检查两个不同列表的元素是否相等?如果没有,则为第一个和最后一个条目。 不幸的是,我的方法不起作用,不幸的是,我找不到我的错误 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

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

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).

您定义了条件

    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).