-1

我是 Prolog 的新手,我想对长度为 n 的给定列表的元素应用 XOR 操作。如果列表在第一个 n-1 元素中包含一些错误元素或最后一个元素为 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),!.

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

4

3 回答 3

1

这是你的规格:

如果列表在第一个 n-1 元素中包含一些错误元素或最后一个元素为 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
于 2015-06-27T16:12:31.753 回答
1

如果 A 或 B 为真,则 A XOR 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              ] ) .
于 2015-06-29T17:44:18.527 回答
-2

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

function([false|_]).

function([X]):- X.

function([_ | XS]) :- function(XS).
于 2015-06-27T12:43:14.123 回答