我有一个列表:[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]]
。
编辑:添加了更多示例。
答案 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
| ?-
上述解决方案将处理a
和b
的多次出现。
如果问题确实仅限于每次出现一次,那么findall/3
和append/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