我在Prolog中有一个原子列表,还有一个谓词allowed(X, Y)
,它检查是否允许一对项目。如何获取列表并将其拆分为多个项目,每个项目都满足谓词?理想情况下,这些对将随机生成然后进行检查,但这只是需要的。
可以假设该列表具有偶数个项目。
答案 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
目标的顺序。