首页 文章

Prolog XOR列表元素

提问于
浏览
-1

我是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 回答

  • 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              ] ) .
    
  • 0

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

    function([false|_]).
    
    function([X]):- X.
    
    function([_ | XS]) :- function(XS).
    
  • -2

    这是你的规范:

    如果列表在第一个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
    

相关问题