首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Prolog:测试2个相似列表

Prolog:测试2个相似列表
EN

Stack Overflow用户
提问于 2020-06-26 18:52:18
回答 1查看 47关注 0票数 0

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

代码语言:javascript
复制
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).
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-26 19:57:43

你定义了条件

代码语言:javascript
复制
    N > 0

在drop/3谓词中,但也要尝试执行

代码语言:javascript
复制
    drop(L1,0,LA1)

所以谓词总是假的。

当我理解你的问题时,试试这个解决方案。

代码语言:javascript
复制
    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).
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62601147

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档