Binary Prolog,将1和0交换为0,并将它们放入列表中的谓词

Binary Prolog,将1和0交换为0,并将它们放入列表中的谓词,binary,prolog,swap,digits,Binary,Prolog,Swap,Digits,新的序言。 我想要一个将1与0和0与1互换的程序,并回答这个问题: ?- swap([1,1,0,1,0,0,0,1], L2). L2 = [0,0,1,0,1,1,1,0] CLPFD解决方案可在各个方向正常工作,供参考: :- use_module(library(clpfd)). swap(X, Y) :- maplist(#\=, X, Y), X ins 0..1, Y ins 0..1. 具体而言: ?- swap(X,Y). X = Y, Y = [

新的序言。 我想要一个将1与0和0与1互换的程序,并回答这个问题:

?- swap([1,1,0,1,0,0,0,1], L2).
L2 = [0,0,1,0,1,1,1,0]

CLPFD解决方案可在各个方向正常工作,供参考:

:- use_module(library(clpfd)).

swap(X, Y) :-
    maplist(#\=, X, Y),
    X ins 0..1,
    Y ins 0..1.
具体而言:

?- swap(X,Y).
X = Y, Y = [] ;
X = [_2640],
Y = [_2658],
_2640 in 0..1,
_2640#\=_2658,
_2658 in 0..1 ;
X = [_3200, _3206],
Y = [_3224, _3230],
_3200 in 0..1,
_3200#\=_3224,
_3224 in 0..1,
_3206 in 0..1,
_3206#\=_3230,
_3230 in 0..1 ;
…
当另一个答案中的
swap/2
不起作用时,工作正常:

?- swap2(X,Y).
X = Y, Y = [] ;
X = [0],
Y = [1] ;
X = [0, 0],        % Doesn't enumerate ([1],[0]), etc.
Y = [1, 1] ;
X = [0, 0, 0],
Y = [1, 1, 1] ;
…

CLPFD解决方案可在各个方向正常工作,供参考:

:- use_module(library(clpfd)).

swap(X, Y) :-
    maplist(#\=, X, Y),
    X ins 0..1,
    Y ins 0..1.
具体而言:

?- swap(X,Y).
X = Y, Y = [] ;
X = [_2640],
Y = [_2658],
_2640 in 0..1,
_2640#\=_2658,
_2658 in 0..1 ;
X = [_3200, _3206],
Y = [_3224, _3230],
_3200 in 0..1,
_3200#\=_3224,
_3224 in 0..1,
_3206 in 0..1,
_3206#\=_3230,
_3230 in 0..1 ;
…
当另一个答案中的
swap/2
不起作用时,工作正常:

?- swap2(X,Y).
X = Y, Y = [] ;
X = [0],
Y = [1] ;
X = [0, 0],        % Doesn't enumerate ([1],[0]), etc.
Y = [1, 1] ;
X = [0, 0, 0],
Y = [1, 1, 1] ;
…

你有没有做过任何可以展示和提出具体问题的尝试?我会给出一些线索。从规则的角度考虑。基本情况是关于交换空列表,
交换([],[])。
(交换的空列表也是空列表)。然后是递归情况。例如,
swap([1 | X],…):-…
如果他们的第一个参数是
[1 | X]
(一个列表的开头是1,末尾是
X
),那么
..
看起来是什么样子?你有没有尝试过任何你可以展示的东西,并提出一个具体的问题?我会给出一些线索。从规则的角度考虑。基本情况是关于交换空列表,
交换([],[])。
(交换的空列表也是空列表)。然后是递归情况。例如,
swap([1 | X],…):-…
如果他们的第一个参数是
[1 | X]
(一个列表的头部是1,尾部是
X
),那么
..
看起来是什么样子?谢谢你的回答,但我正在尝试递归地做这件事,并且没有maplist/3。还有其他方法吗?@Mitsos是的,有两种其他方法可以递归地实现这一点。您可以查看并关注列表处理的示例,了解如何开始。在这一点上,很难说你知道多少Prolog,而且这不是一个开始Prolog的教程站点。这更多是为了问一些具体的编码问题。谢谢你的回答,但我正在尝试递归地做,而不使用maplist/3。还有其他方法吗?@Mitsos是的,有两种其他方法可以递归地实现这一点。您可以查看并关注列表处理的示例,了解如何开始。在这一点上,很难说你知道多少Prolog,而且这不是一个开始Prolog的教程站点。更多的是询问具体的编码问题。尝试使用我的anwer中的
swap
进行
length(X,uu),swap2(X,Y)。
公平枚举。@danlei这将在bactracking上生成无限循环,例如
length(X,u),swap2(X,[1,0])。
我的意思是使用最通用的查询生成,但是是的-足够公平。尝试
length(X,uu),swap(X,Y)。
使用我anwer中的
swap
进行公平枚举。@danlei这将在bactracking上生成无限循环,例如
length(X,uu),swap2(X,[1,0])。
好吧,我的意思是使用最通用的查询生成,但是的-足够公平。