2015-06-27 88 views
-1

我是Prolog中的新成員,我想對給定長度爲n的列表的元素應用XOR操作。如果列表在第一個n-1元素中包含一些假元素,或者如果最後一個元素爲True,謂詞應該返回True。列表元素上的Prolog XOR

到目前爲止我已經寫了下面的代碼,但是它不能正常工作,比如查詢?--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

「謂語返回真時列表在第一個n-1元素中包含false,或者如果最後一個元素爲True。「 - 請澄清XOR列表是什麼意思,根據該描述[true,false,false]應該返回false(前n-1個元素不全是假,最後一個元素爲false) – Bond

+0

對不起!我剛剛編輯了正確的方式 – user3074510

回答

1

這裏是你的再次規格:

謂語應該返回真,如果列表包含在第一n-1個元素,或者最後一個元素是真正的一些虛假的元素。

讓我們定義謂詞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

請注意,SICStus Prolog的頂層並沒有顯示'member/2'打開的選擇點。 'memberd/2'會更好。此外,''>' – false

+1

'布爾值'不需要'bool' – false

+0

@false:Fxd。謝謝! – repeat

-2

我手邊沒有prolog編譯器,但這應該是關鍵。

function([false|_]). 

function([X]):- X. 

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

謝謝你的回覆。但它也不能正常工作,例如查詢?-function([true,false])應該返回false,因爲在前n-1個元素中不存在假元素(1≤i user3074510

0

A XOR B如果真,如果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    ]) .