如何比较两个谓词Prolog的值

时间:2019-05-01 00:29:10

标签: list prolog

我有三个谓词,它们返回元素数量的一半  在列表中,为1的数目和为0的数目。

我需要编写一个谓词,如果元素数量的一半小于列表中的零个数,则返回false;如果元素数量的一半小于列表中的零个数,则返回false。

这是我所做的,但是不起作用:

   apply(L,R):- number_elements(L,0) < number_zeros(L,0),!,fail.
   apply(L,R):- number_elements(L,0) < number_ones(L,0),!,fail.

我的数字元素是:

number_elements(List, HalfCount) :- length(List, N), HalfCount is N div 2.

我的number_ones等于我的number_zeros:

number_ones([], 0).
number_ones([H|T], N) :-
   number_ones(T, X),
   (  H == 1
   -> N is X+1
   ;  N is X
   ).

谢谢!

1 个答案:

答案 0 :(得分:0)

在Prolog中,您的谓词不能返回true / false以外的值,因此您不能编写诸如predicate1 < predicate2之类的查询。如果要“返回数字”,请在谓词的变量中对其进行编码。您写道您已经定义了谓词number_elementsnumber_zeros / number_ones。我假设这些谓词通过它们的第二个变量“返回”数字,例如

?- number_zeros([0,1,2], 0).
false.
?- number_zeros([0,1,2], 1).
true .
?- number_zeros([0,1,2], N).
N = 1 .

现在可以通过以下方式编写所需的比较:将谓词的第二个参数用作变量,然后对这些变量进行比较:

apply(L) :-
  length(L, N),
  number_zeros(L, M0),
  number_ones(L, M1),
  H is N//2,
  H >= M0,
  H >= M1.