遵循Prolog中某些编码的列表元素的列表。

问题描述 投票:0回答:1

我有一个变量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.
prolog
1个回答
1
投票

看来你的谓词正好满足"......但一次只能有一个。"的规范,因为这可能是指 "在回溯上产生连续的解"。

你还想把解收集在一个袋子里。

然而,你的修正必须将你的谓词修正为。因为 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.
© www.soinside.com 2019 - 2024. All rights reserved.