我有一个获取列表的函数,并删除该列表中的所有唯一元素:
repeating(Q, L):-
repeating(Q, Q, L).
repeating([], _, []).
repeating([H | T], Q, [H | L]):-
count(H, Q, N),
N > 1, !,
repeating(T, Q, L).
repeating([H | T], Q, L):-
count(H, Q, N),
N = 1,
repeating(T, Q, L).
例如查询
repeating([1, 2, 3, 4, 5, 2, 7, 7, 3, 8], X).
给出
X = [2, 3, 2, 7, 7, 3].
我想将它应用于由四个元素长列表组成的列表,仅检查第三个元素,例如
repeating([[1, 2, 3, 4], [5, 6, 7, 8], [3, 5, 7, 9], [4, 3, 2, 1]], X).
将返回
X = [[5, 6, 7, 8], [3, 5, 7, 9].
仅列出具有非唯一第三元素的列表。我的代码现在只适用于简单的列表,例如第一个,我整个上午都试图想出一种方法来修改它以适用于这些案例,因为任意长的四个元素长列表列表,但未能找到这样做的方法,并非常感谢对此的一些指导。
感谢。
答案 0 :(得分:1)
您可以获取一个函数来检索每个列表的第三个元素,然后通过检查这些元素来调整代码
%get the third element of a list
third([_,_,E|_], E).
%Build a list made of the third elements of the input list
buildthirdslist([],[]).
buildthirdslist([X|Xl],[Th|Thl]):-
third(X,Th),
buildthirdslist(Xl,Thl).
%Your code adapted
repeatingthirds(Q, L):-
buildthirdslist(Q,Ths),
repeatingthirds(Q, Ths, L).
repeatingthirds([], _, []).
repeatingthirds([H | T], Q, [H | L]):-
third(H,Th),
count(Th, Q, N),
N > 1, !,
repeatingthirds(T, Q, L).
repeatingthirds([H | T], Q, L):-
third(H,Th),
count(Th, Q, N),
N = 1,
repeatingthirds(T, Q, L).
答案 1 :(得分:0)
与吉列尔莫的解决方案略有不同。这一个会使repeating
谓词保持不变,并使用不同的count
:
repeating(Q, L):-
repeating(Q, Q, L).
repeating([], _, []).
repeating([H | T], Q, [H | L]):-
count(H, Q, N),
N > 1, !,
repeating(T, Q, L).
repeating([H | T], Q, L):-
count(H, Q, N),
N = 1,
repeating(T, Q, L).
count(H, Q, N) :-
count(H, Q, 0, N).
count([_,_,E,_], [[_,_,E,_]|T], A, N) :-
A1 is A + 1,
count([_,_,E,_], T, A1, N).
count([_,_,E,_], [[_,_,X,_]|T], A, N) :-
E \= X,
count([_,_,E,_], T, A, N).
count(_, [], A, A).
快速测试:
| ?- repeating([[1, 2, 3, 4], [5, 6, 7, 8], [3, 5, 7, 9], [4, 3, 2, 1]], X).
X = [[5,6,7,8],[3,5,7,9]] ? a
no
| ? -