prolog - 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).
解决方案
您定义了条件
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).
推荐阅读
- javascript - 通过嵌套数组和传递的键匹配进行复杂的 json 排序
- python - ModuleNotFoundError:没有名为“flask_restful”的模块?
- html - SVG 图像徽标未在 Firefox 中显示
- excel - 计算每次变化的列中的数据并在单元格中返回该计数
- java - 如何在具有组合 PK 的表中插入多个带有 JPA 存储库的记录,其中一个是自动递增的?
- database-design - 如何改进这种星型模式设计
- asp.net-mvc - 在 EF MVC 中应用左内连接
- android - 避免用户明确删除应用数据
- javascript - 如何从 CI 构建管道发布 NPM 包并仍然自动化版本控制?
- r - 将光标移动到条上时,带有 geom_bar 的 ggplotly 显示错误的 y 轴值