我有三个谓词,它们返回元素数量的一半 在列表中,为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
).
谢谢!
答案 0 :(得分:0)
在Prolog中,您的谓词不能返回true
/ false
以外的值,因此您不能编写诸如predicate1 < predicate2
之类的查询。如果要“返回数字”,请在谓词的变量中对其进行编码。您写道您已经定义了谓词number_elements
和number_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.