Prolog XOR列表元素

时间:2015-06-27 12:24:34

标签: prolog logic-programming

我是Prolog的新手,我想对长度为n的给定列表的元素应用XOR运算。如果list在第一个n-1元素中包含一些false元素,或者last元素为True,则谓词应返回True。

到目前为止,我已编写了以下代码,但它无法正常运行,例如查询? - function([true,false,false])谓词应返回True但返回false。

function([X|_]) :-  \ + X,!.
function([X]):-X,!.
function([_|XS]):- function(XS),!,helper(XS).

helper([X]):- X,!.
helper([_|YS]):- helper(YS),!.

如果你能帮助我,我将不胜感激。谢谢!

3 个答案:

答案 0 :(得分:1)

这是你的规范:

  

如果list在第一个n-1元素中包含一些false元素,或者last元素为True,则谓词应返回True。

让我们像这样定义谓词xor_check/1

xor_check(List) :-
   booleans(List),
   append(ButLast,[Last],List),
   xor_check__aux(Last,ButLast).

以上代码基于xor_check__aux/2,后者依据memberd/2构建:

xor_check__aux(true,_).
xor_check__aux(false,ButLast) :-
   memberd(false,ButLast).

辅助谓词boolean/1booleans/1可以定义为:

boolean(true).
boolean(false).

booleans([]).
booleans([B|Bs]) :-
   boolean(B),
   booleans(Bs).

示例查询(使用SICStus Prolog 4.3.2):

?- xor_check([true,false]).
no
?- xor_check([true,true,true]).
yes
?- xor_check([true,false,false]).
yes

答案 1 :(得分:1)

如果A或B为真,则为异或,如果为真,则为真,但不是两者。这是真相表:

  A   |   B   | A XOR B
------+------ |---------
false | false | false
false | true  | true
true  | false | true
true  | true  | false

将该真值表写为Prolog谓词:

%      A       B   | A XOR B
%    -----   ----- | -------
xor( false , false , false   ) .
xor( false , true  , true    ) .
xor( true  , false , true    ) .
xor( true  , true  , false   ) .

然后它就是一个简单的递归列表。当列表折叠为单个元素时,它会在[true]上成功,否则将失败:

xor_list( [ A,B | T ] ) :- xor(A,B,C) , xor_list( [C|T] ) .
xor_list( [ true    ] ) .

这可以全部折叠为稍小/更简单的谓词:

xor_list( [ false , false | T ] ) :- xor_list( [ false | T ] ) .
xor_list( [ false , true  | T ] ) :- xor_list( [ true  | T ] ) .
xor_list( [ true  , false | T ] ) :- xor_list( [ true  | T ] ) .
xor_list( [ true  , true  | T ] ) :- xor_list( [ false | T ] ) .
xor_list( [ true              ] ) .

答案 2 :(得分:-2)

我手头没有prolog编译器,但这应该可以解决问题。

function([false|_]).

function([X]):- X.

function([_ | XS]) :- function(XS).