我有一个变量L1的列表,一个变量L2的单列表,和一个变量L3的列表,其中元素是L1的子列表,与L2共享一个变量。
我有一个谓词common_v(L1,L2,L3),它可以返回L3的元素,但每次只能返回一个。
它的工作原理是这样的。
?- L1= [[A,B,C],[D,C,A],[B,F,E],[G,H,I]],
L2= [C,X,Z],
common_v([[A,B,C],[D,C,A],[B,F,E],[G,H,I]],[C,X,Z],L3).
L1= [[A,B,C],[D,C,A],[B,F,E],[G,H,I]], L2= [C,X,Z], L3= [A,B,C];
L1= [[A,B,C],[D,C,A],[B,F,E],[G,H,I]], L2= [C,X,Z], L3= [D,C,A];
false.
但应该是这样的
L1= [[A,B,C],[D,C,A],[B,F,E],[G,H,I]],
L2= [C,X,Z],
common_v([[A,B,C],[D,C,A],[B,F,E],[G,H,I]],[C,X,Z],L3).
L1= [[A,B,C],[D,C,A],[B,F,E],[G,H,I]], L2= [C,X,Z], L3= [[A,B,C],[D,C,A]].
我如何实现它? 谓词common_v的定义如下。
common_v(L1,L2,L3):- member(L,L1),member(E,L2),member(F,L),E==F.
看来你的谓词正好满足"......但一次只能有一个。"的规范,因为这可能是指 "在回溯上产生连续的解"。
你还想把解收集在一个袋子里。
然而,你的修正必须将你的谓词修正为。因为 L3
在那里是不对的。
common_v(L1,L2,L):- member(L,L1),member(E,L2),member(F,L),E==F.
那就。
common_v(L1,L2,L):- member(L,L1),member(E,L2),member(F,L),E==F.
:- begin_tests(bagit).
test(one) :-
L1 = [[A,B,C],[D,C,A],[B,F,E],[G,H,I]],
L2 = [C,X,Z],
bagof(Lx,common_v(L1,L2,Lx),S),
S == [[A,B,C],[D,C,A]].
:- end_tests(bagit).
rt :- run_tests(bagit).
查询。
?- rt.
% PL-Unit: bagit . done
% test passed
true.