在prolog中的list中生成K个元素的组合时,如何忽略结果的第一个匹配?
%这里是代码。
combination(0,_,[]).
combination(N,[X|T],[X|Comb]):-N>0,N1 is N-1,combination(N1,T,Comb).
combination(N,[_|T],Comb):-N>0,combination(N,T,Comb).
?- combination(3,[3,8,9,10,12,14],S).
%result will be.
S = [3, 8, 9] ;
S = [3, 8, 10] ;
S = [3, 8, 12] ;
S = [3, 8, 14] ;
S = [3, 9, 10] ;
S = [3, 9, 12] ;
S = [3, 9, 14] ;
S = [3, 10, 12] ;
S = [3, 10, 14] ;
S = [3, 12, 14] ;
S = [8, 9, 10] ;
S = [8, 9, 12] ;
S = [8, 9, 14] ;
S = [8, 10, 12] ;
S = [8, 10, 14] ;
S = [8, 12, 14] ;
S = [9, 10, 12] ;
S = [9, 10, 14] ;
S = [9, 12, 14] ;
S = [10, 12, 14] ;
false.
%I want to ignore the first match [3,8,9].
回答1
根据您想要的原因,有多种选择。
?- combination(3,[3,8,9,10,12,14],S). % original question
S = [3,8,9], unexpected
; S = [3,8,10]
; S = [3,8,12]
; ... .
?- dif(S,[3,8,9]), combination(3,[3,8,9,10,12,14],S).
S = [3,8,10]
; S = [3,8,12]
; S = [3,8,14]
; ... .
?- combination(3,[8,9,10,12,14],S).
S = [8,9,10]
; S = [8,9,12]
; S = [8,9,14]
; ... .
?- call_nth(combination(3,[3,8,9,10,12,14],S), Nth), Nth>1.
S = [3,8,10], Nth = 2
; S = [3,8,12], Nth = 3
; S = [3,8,14], Nth = 4
; ... .
首先,您可能不想要那个特定的解决方案,然后使用 dif/2
,或者只使用较小的 list,最后,您想要排除第一个答案(在这种情况下也是第一个解决方案),然后使用http://www.complang.tuwien.ac.at/ulrich/iso-prolog/call_nth。