大家好,
以下代码执行递归检查。对于每次调用,由于条件,F得到值1或0。如果所有检查都有结果1,我希望我的test_liars谓词返回True,如果至少有一个调用,则返回False,将F&#39的值设置为0。
test_liars实际上做了什么,并不是真正渴望解释的东西,但如果被问到我可以。
test_liars应该返回True给Flag的参数,问:
test_liars(2,[3,2,1,4,2],[1,0,0,1,0],Flag)
给出不同的列表,而不是[1,0,0,1,0],它必须返回False
test_liars(_,[],_,_) .
test_liars(N,[HF|TF],[HT|TT],Flag) :-
(HT == 0 -> ( N >= HF -> F = 1 ; F = 0)
; ( N < HF -> F = 1 ; F = 0)),
test_liars(N,TF,TT,Flag),
write(F),
(F == 0 -> Flag = 'True' ; Flag = 'False').
答案 0 :(得分:0)
首先,我认为将嵌套的if-then-else结构转换为谓词更为优雅。例如test_liar/4
:
% test_liar(N,HT,HF,F).
test_liar(N,0,HF,1) :-
N >= HF,
!.
test_liar(N,1,HF,1) :-
N < HF,
!.
test_liar(_,_,_,0).
这使事情变得更容易。现在你可以写:
test_liars(_,[],_,_).
test_liars(N,[HF|TF],[HT|TT],Flag) :-
test_liar(N,HT,HF,F),
test_liars(N,TF,TT,Flag),
write(F),
(F == 0 -> Flag = 'True' ; Flag = 'False').
尽管如此,我们还没有。如果至少有一个元素是骗子,则Flag
应该返回'False'
。这意味着在基本情况下,有没有说谎者,所以我们应该返回'True'
:
test_liars(_,[],_,'True').
在归纳的情况下,我们必须构建某种“和”,如:
custom_and('True',1,'True') :-
!.
custom_and(_,_,'False').
现在我们只需要对递归custom_and/3
和test_liars
的结果调用此test_liar
:
test_liars(N,[HF|TF],[HT|TT],Flag) :-
test_liar(N,HT,HF,F),
test_liars(N,TF,TT,SubFlag),
write(F),
custom_and(SubFlag,F,Flag).
或现在完整的代码:
test_liar(N,0,HF,1) :-
N >= HF,
!.
test_liar(N,1,HF,1) :-
N < HF,
!.
test_liar(_,_,_,0).
custom_and('True',1,'True') :-
!.
custom_and(_,_,'False').
test_liars(_,[],_,'True').
test_liars(N,[HF|TF],[HT|TT],Flag) :-
test_liar(N,HT,HF,F),
test_liars(N,TF,TT,SubFlag),
write(F),
custom_and(SubFlag,F,Flag).