子列表的序言长度不返回长度但返回假?

prolog length of sublist not returning length but returning false?

所以不确定为什么我的代码不起作用。但是我试图在给定下限和上限的情况下找到子列表的长度我有这个。

myrange(_,_,[],0).
myrange(F,L,[H|T],X) :- F <= H,myrange(F,L,T,Y), X is Y+1.
myrange(F,L,[A|T],X) :- L >= A,myrange(F,L,T,Y), X is Y+1.
myrange(F,L,[Y|T],X) :-F>Y, myrange(F,L,T,X).

但它 returns 是假的,不知道为什么。

Prolog 中的 "Smaller or equal" 运算符是 =<,而不是 <=。 (正如评论中所指出的,这样做的原因是 <= 看起来太像一个暗示箭头,不应与一个暗示箭头混淆。)

我不知道你的 prolog 系统,但是 SWI Prolog 给我一个你的代码的编译错误:"Operator expected",因为它不知道运算符 <=.

换算子后,确实得到了结果。但是,谓词本身是 non-deterministic,也就是说你没有说 only 如果第一个子句是适用:

?- myrange(7,3,[1,2,3,4,5,6,7,8,9], L).
L = 6 ;
L = 5 ;
L = 5 ;
L = 4 ;
L = 5 ;
L = 4

考虑引入削减 (!) 或改进条件以获得独特的结果:

myrange(_,_,[],0).
myrange(F,L,[H|T],X) :- F =< H, !, myrange(F,L,T,Y), X is Y+1.
myrange(F,L,[A|T],X) :- L >= A, !, myrange(F,L,T,Y), X is Y+1.
myrange(F,L,[Y|T],X) :- F >  Y, !, myrange(F,L,T,X).

?- myrange(7,3,[1,2,3,4,5,6,7,8,9], L).
L = 6 ;
false.