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

If statement Prolog,从连续递归检查返回布尔值,if-statement,prolog,If Statement,Prolog,各位好, 下面的代码执行递归检查。对于每个调用,F都会根据条件获得1或0的值。如果所有检查的结果都为1,我希望我的test_-liars谓词返回True;如果至少有一个调用,则返回False,将F的值设置为0 测试说谎者实际上做的事情,并不是很想解释,但如果有人问我,我可以解释 测试说谎者应将Flag的论点回复为True,询问: test_liars(2,[3,2,1,4,2],[1,0,0,1,0],Flag) 给定不同的列表,而不是[1,0,0,1,0],它必须返回False t

各位好,

下面的代码执行递归检查。对于每个调用,F都会根据条件获得1或0的值。如果所有检查的结果都为1,我希望我的test_-liars谓词返回True;如果至少有一个调用,则返回False,将F的值设置为0

测试说谎者实际上做的事情,并不是很想解释,但如果有人问我,我可以解释

测试说谎者应将Flag的论点回复为True,询问:

  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').
测试说谎者(u,[],u,u)。
测试说话者(N、[HF | TF]、[HT | TT]、标志):-
(HT==0->(N>=HF->F=1;F=0)
(NF=1;F=0)),
测试说话者(N、TF、TT、标志),
写(F),
(F==0->Flag='True';Flag='False')。

首先,我认为将嵌套的if-then-else结构转换为谓词更为优雅。例如
测试说谎者/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).
因此,在归纳的情况下,我们必须构造某种“和”,如:

现在,我们只需要对递归的
测试说谎者
测试说谎者
的结果调用这个
自定义和/3

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).
测试说话者(N、[HF | TF]、[HT | TT],标志):-
测试说话者(N、HT、HF、F),
测试说话者(N、TF、TT、子滞后),
写(F),
自定义_和(子标签、F、标志)。
或者现在是完整的代码:

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).
测试说话者(N,0,HF,1):-
N>=HF,
!.
测试说话者(N,1,HF,1):-
N
首先,非常感谢。您的代码似乎工作得很好,prolog返回True,对于[1,0,0,0],这是不正确的。您在这里的工作已经完成。它似乎工作得很完美,我会详细研究代码,这样我就能完全理解它。非常感谢
custom_and('True',1,'True') :-
    !.
custom_and(_,_,'False').
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).