Prolog - 将程序应用于特定列表成员

时间:2014-03-19 13:07:42

标签: list prolog nested

我有一个获取列表的函数,并删除该列表中的所有唯一元素:

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

仅列出具有非唯一第三元素的列表。我的代码现在只适用于简单的列表,例如第一个,我整个上午都试图想出一种方法来修改它以适用于这些案例,因为任意长的四个元素长列表列表,但未能找到这样做的方法,并非常感谢对此的一些指导。

感谢。

2 个答案:

答案 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

| ? -