根据Prolog中的谓词配对列表项

时间:2016-07-20 04:14:03

标签: prolog

我在Prolog中有一个原子列表,还有一个谓词allowed(X, Y),它检查是否允许一对项目。如何获取列表并将其拆分为多个项目,每个项目都满足谓词?理想情况下,这些对将随机生成然后进行检查,但这只是需要的。

可以假设该列表具有偶数个项目。

2 个答案:

答案 0 :(得分:0)

我最终按如下方式进行:

checked(_, _, _, N) :-
   N > 5,
   fail.
checked(List, ReturnedList, [X,Y], _) :-
   random_member(X, List),
   select(X, List, List1),
   random_member(Y, List1),
   allowed(X, Y),
   select(Y, List1, ReturnedList).
checked(A, B, C, N) :-
   checked(A, B, C, N+1).

pairMe([], []).
pairMe(List, Result) :-
   checked(List, ReturnedList, [X,Y], 0),
   pairMe(ReturnedList, A),
   append([[X,Y]], A, Result).

它不是很好,因为它不能保证它总能找到结果,即使它存在,但它至少对我有用。

答案 1 :(得分:0)

pair(L1,L2,(M1,M2)) :-
    member(M1,L1),
    member(M2,L2).

将在回溯时检索每个可能的对。例如:

?- pair([1,2,3],[a,b],X).
X = (1, a) ;
X = (1, b) ;
X = (2, a) ;
X = (2, b) ;
X = (3, a) ;
X = (3, b).

?- 

也可以在单个列表中使用:

?- pair([1,2,3],[1,2,3],X)

但是,您的问题毫无意义,因为allowed/2所有允许的对都是预定义。您可以只检索允许/ 2的所有解决方案。所以,这就是你要找的东西,我想:

allowed_pair(List,(A,B)) :-
    allowed(A,B),
    member(A,List),
    member(B,List).

例如,假设allowed/2被定义为:

allowed(1,b).
allowed(2,a).

然后:

?- allowed_pair([1,2,3,a,4,z],X).
X = (2, a) ;
false.

?- 

根据您的效果要求和allowed/2实施情况,您可以交换allowed_pair/2目标的顺序。