Prolog,从连续递归检查返回布尔值

时间:2017-03-30 14:23:52

标签: if-statement prolog

大家好,

以下代码执行递归检查。对于每次调用,由于条件,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').

1 个答案:

答案 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/3test_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).