这个问题是在回答StackOverflow上的另一个问题时出现的,该问题是(概括一点)生成由有限元素集形成的所有序列,没有重复出现。
正如鲍里斯在评论中正确指出的那样,这个问题有许多现有的解决方案。但是,我对不使用累加器(即,与新选择的元素进行比较的已选择元素的列表)但使用dif/2
语句的解决方案感兴趣。
为了说明,在我的以下程序中,我有 4 个元素,并且在 4 次递归调用之后,有几个div/2
语句声明到目前为止已经选择的 4 个元素是成对不同的。由此可以推断,继续递归并寻找第五个元素是没有意义的,因为给定的div/2
语句已经没有元素了。有没有办法将这些“知识”编码到程序中,使其不再循环?
:- use_module(library(apply)).
:- use_module(library(dif)).
sequences([]).
sequences([H|T]):-
maplist(dif(H), T),
between(1, 4, H),
sequences(T).
当前的循环行为:
?- sequences(X).
X = [] ;
X = [1] ;
...
X = [4, 3, 1, 2] ;
X = [4, 3, 2, 1] ;
<LOOP>