Prolog列表列表的谓词列表

时间:2016-05-22 09:17:23

标签: prolog

我有一个列表:[a([x,y]), b([u,v])],我希望我的结果为[[x,y], [u,v]]。 这是我的代码:

p(L, Res) :- 
    findall(X, (member(a(X), L)), A1), append([A1],[],L1),
    findall(Y, (member(b(Y), L)), A2), append(L1,[A2],L2),
    append(L2, Res).

这提供了部分好的结果,但如果我的列表是[a([x,y]), c([u,v])],我希望结果为:[[x,y],[]]并且它是[[x,y]]
 更多例子:

 p([b([u,v]), a([x,y]), c([s,t]), d([e,f])], R)

我得到的结果:[[x,y],[u,v]](正如预期的那样)。

p([b([u,v]), z([x,y]), c([s,t]), d([e,f])], R)

我得到的结果:[[u,v]]'
我想要的结果是:[[],[u,v]]

编辑:添加了更多示例。

2 个答案:

答案 0 :(得分:1)

现在它已经清楚问题陈述到底是什么,解决方案有点了解。您当前的解决方案有点过头了,可以简化。此外,如果未找到该术语,您希望拥有[]元素的情况略微超出范例,因此可以作为例外处理。 @AnsPiter对使用=../2有正确的想法,特别是如果您需要一个解决方案来处理列表中多次出现的a和/或b

p(L, Res) :-
    find_term(a, L, As),     % Find the a terms
    find_term(b, L, Bs),     % Find the b terms
    append(As, Bs, Res).     % Append the results

find_term(F, L, Terms) :-
    Term =.. [F, X],
    findall(X, member(Term, L), Ts),
    (   Ts = []              % No results?
    ->  Terms = [[]]         % yes, then list is single element, []
    ;   Terms = Ts           % no, then result is the list of terms
    ).

用法:

| ?- p([b([u,v]), z([x,y]), c([s,t]), d([e,f])], R).

R = [[],[u,v]]

yes
| ?-  p([b([x,y]), a([u,v])], L).

L = [[u,v],[x,y]]

yes
| ?-

上述解决方案将处理ab的多次出现。

如果问题确实仅限于每次出现一次,那么findall/3append/3就会过度杀戮并且可以写出谓词:

p(L, [A,B]) :-
    (   member(a(A), L)
    ->  true
    ;   A = []
    ),
    (   member(b(B), L)
    ->  true
    ;   B = []
    ).

答案 1 :(得分:0)

Term =.. List : 统一列表,其列表的头部是与主要算子对应的原子 术语和尾部是术语的参数列表。

示例:

| ?- foo(n,n+1,n+2)=..List.
List = [foo,n,n+1,n+2] ? 

| ?- Term=..[foo,n,n+1,n+2].
Term = foo(n,n+1,n+2)

依靠你的建议;你有一个术语包含一个参数列表
所以;

p([],[]).                            
p([X|Xs], Result) :-
            X=..[F,Y],
            (%IF
            \+(F='c')-> % not(F=c)            
            Result=[Y|Res]; 
            %ELSE           
            Result = Res % Result = [Res] ==> [[x,y],[]]
            ),
            p(Xs,Res). 

测试:

| ?- p([a([x,y]), c([u,v])],R).
R = [[x,y]] ? 
yes

| ?- p([a([x,y]), b([u,v])],R).
R = [[x,y],[u,v]] ? 
yes