Algorithm 序曲置换

Algorithm 序曲置换,algorithm,prolog,permutation,Algorithm,Prolog,Permutation,我正在努力学习prolog,因为下学期我将在学校上人工智能课。我已经能够掌握基本知识,并且可以做基于关系的事情,然而,我一直在尝试学习排列和组合电子技术,它们看起来非常简单,但这让我想到了一个我不知道如何解决的问题。假设我想知道1和0的排列,在一定条件下,一行中必须至少有4个1。 我不知道从何处开始尝试并找到解决方案,但最终我希望代码可以执行以下操作: ?- placeOnesAndZeros(9,X). % where 9 is the length of the list/array and

我正在努力学习prolog,因为下学期我将在学校上人工智能课。我已经能够掌握基本知识,并且可以做基于关系的事情,然而,我一直在尝试学习排列和组合电子技术,它们看起来非常简单,但这让我想到了一个我不知道如何解决的问题。假设我想知道1和0的排列,在一定条件下,一行中必须至少有4个1。 我不知道从何处开始尝试并找到解决方案,但最终我希望代码可以执行以下操作:

?- placeOnesAndZeros(9,X).
% where 9 is the length of the list/array and X is the permutations

[0,0,0,0,0,0,0,0,0]
[1,1,1,1,0,0,0,0,0]
[0,1,1,1,1,0,0,0,0]
[0,0,1,1,1,1,0,0,0]
[0,0,0,1,1,1,1,0,0]
[0,0,0,0,1,1,1,1,0]
[0,0,0,0,0,1,1,1,1]
[1,1,1,1,0,1,1,1,1]
[1,1,1,1,1,0,0,0,0]
[0,1,1,1,1,1,0,0,0]
[0,0,1,1,1,1,1,0,0]
[0,0,0,1,1,1,1,1,0]
[0,0,0,0,1,1,1,1,1]
[1,1,1,1,1,1,0,0,0]
[0,1,1,1,1,1,1,0,0]
[0,0,1,1,1,1,1,1,0]
[0,0,0,1,1,1,1,1,1]
[1,1,1,1,1,1,1,0,0]
[0,1,1,1,1,1,1,1,0]
[0,0,1,1,1,1,1,1,1]
[1,1,1,1,1,1,1,1,0]
[0,1,1,1,1,1,1,1,1]
[1,1,1,1,1,1,1,1,1]
提前谢谢你

编辑代码:

printList([ ]).
printList([H|T]) :- print(H), nl, printList(T).

eval([],_).
eval([H|T],[1,0]):-member(H,[1,0]),eval(T,[1,0]).

placeOnesAndZeros(N, L):-length(L,N), eval(L,[1,0]).
生成并测试它是用于搜索解决方案空间的基本技术的名称。在Prolog中,它实际上是内置的。只需提供一个过滤器,丢弃不需要的内容:

?- placeOnesAndZeros(9,L),once(append(_,[1,1,1,1|_],L)).
一旦需要/1,否则append/3可能会多次成功。 为了检查方法的正确性,下面是如何计算我们得到了多少解决方案:

?- aggregate(count,L^H^T^(placeOnesAndZeros(9,L),once(append(H,[1,1,1,1|T],L))),C).
C = 111.
可使用以下方法避免对变量L、H、T(最后2个变量仅用于聚合)进行量化:

编辑

正如@潜伏者所指出的,我的过滤器不正确。试试看

atLeastFourOnes(L) :- memberchk(1,L), atLeastFourOnes_(L).

atLeastFourOnes_([]).
atLeastFourOnes_([0|L]) :- atLeastFourOnes_(L).
atLeastFourOnes_([1,1,1,1|L]) :- stripOnes(L,R), atLeastFourOnes_(R).
这就产生了

?- placeOnesAndZeros(9,L),atLeastFourOnes(L).
L = [1, 1, 1, 1, 1, 1, 1, 1, 1] ;
L = [1, 1, 1, 1, 1, 1, 1, 1, 0] ;
L = [1, 1, 1, 1, 1, 1, 1, 0, 0] ;
...

?- aggregate(count,L^(placeOnesAndZeros(9,L),atLeastFourOnes(L)),C).
C = 22.
生成并测试它是用于搜索解决方案空间的基本技术的名称。在Prolog中,它实际上是内置的。只需提供一个过滤器,丢弃不需要的内容:

?- placeOnesAndZeros(9,L),once(append(_,[1,1,1,1|_],L)).
一旦需要/1,否则append/3可能会多次成功。 为了检查方法的正确性,下面是如何计算我们得到了多少解决方案:

?- aggregate(count,L^H^T^(placeOnesAndZeros(9,L),once(append(H,[1,1,1,1|T],L))),C).
C = 111.
可使用以下方法避免对变量L、H、T(最后2个变量仅用于聚合)进行量化:

编辑

正如@潜伏者所指出的,我的过滤器不正确。试试看

atLeastFourOnes(L) :- memberchk(1,L), atLeastFourOnes_(L).

atLeastFourOnes_([]).
atLeastFourOnes_([0|L]) :- atLeastFourOnes_(L).
atLeastFourOnes_([1,1,1,1|L]) :- stripOnes(L,R), atLeastFourOnes_(R).
这就产生了

?- placeOnesAndZeros(9,L),atLeastFourOnes(L).
L = [1, 1, 1, 1, 1, 1, 1, 1, 1] ;
L = [1, 1, 1, 1, 1, 1, 1, 1, 0] ;
L = [1, 1, 1, 1, 1, 1, 1, 0, 0] ;
...

?- aggregate(count,L^(placeOnesAndZeros(9,L),atLeastFourOnes(L)),C).
C = 22.

[0,0,0,0,0,0,0,0,0]
一行中没有四个1。此外,您的条件似乎比“它必须有四个1连成一行”强,但任何时候它有一个1,该1必须是4个或更多连续1的一部分。我的缺点是,我试图键入代码会做什么,因为我对如何做有点迷茫,但是你的条件更准确地说明了我想要什么。如果你知道任何序言以及如何操作列表,那么你需要尝试一些东西。如果你对此不熟悉,那么你应该仔细阅读并尝试一个教程。当有人问这样一个开放式的问题,他们需要编写代码来执行某项任务,而他们“不知道从哪里开始”,那么那些被要求帮助的人就不知道你是否只需要一个语言教程或什么。所以这个问题太宽泛了。通常情况下,在这个网站上,你需要做一些尝试,并显示一些代码来指明你被卡在哪里。在这两种描述中,
[0,0,0,0,0,0,0,0]
仍然不是有效的解决方案置换是一种
换位
,置换并不意味着你填写1和0,而是改变它们的位置。
[0,0,0,0,0,0,0,0]
一行中没有四个1。此外,您的条件似乎比“它必须有四个1连成一行”强,但任何时候它有一个1,该1必须是4个或更多连续1的一部分。我的缺点是,我试图键入代码会做什么,因为我对如何做有点迷茫,但是你的条件更准确地说明了我想要什么。如果你知道任何序言以及如何操作列表,那么你需要尝试一些东西。如果你对此不熟悉,那么你应该仔细阅读并尝试一个教程。当有人问这样一个开放式的问题,他们需要编写代码来执行某项任务,而他们“不知道从哪里开始”,那么那些被要求帮助的人就不知道你是否只需要一个语言教程或什么。所以这个问题太宽泛了。通常情况下,在这个网站上,你需要做一些尝试,并显示一些代码来指明你被卡在哪里。在这两种描述中,
[0,0,0,0,0,0,0,0]
仍然不是有效的解决方案排列是一种换位,排列并不意味着你填写了1和0,而是改变了它们的位置。非常感谢!这实际上帮了我很多忙,你和潜伏者解释得很好,我能理解,所以再次感谢:非常感谢!这实际上帮了我很多忙,你和潜伏者解释得很好,我能理解,所以再次谢谢你:D