我是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),!.
如果你能帮助我,我将不胜感激。谢谢!
答案 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/1
和booleans/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).