Prolog,谓词交换1到0和0到1并将它们放在一个列表中

时间:2017-06-27 15:33:45

标签: binary prolog swap digits

Prolog新手。 我想要一个交换1到0和0到1的程序并回答这个问题:

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

2 个答案:

答案 0 :(得分:6)

complement(0, 1).
complement(1, 0).

swap(X, Y) :- maplist(complement, X, Y).

答案 1 :(得分:3)

适用于所有方向的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] ;
…