子列表的序言长度不返回长度而是返回false?

时间:2018-12-03 01:36:10

标签: list prolog range sublist

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

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).

但返回错误,不确定原因。

1 个答案:

答案 0 :(得分:1)

Prolog中的“等于或小于”运算符为=<,而不是<=。 (如评论中所指出,这样做的原因是<=看起来太像蕴含箭头,不应与之混淆。)

我不了解您的prolog系统,但是SWI Prolog给您的代码出现了一个编译错误:“期望运算符”,因为它不知道运算符<=

更改运算符后,我确实得到了结果。但是,谓词本身是不确定的,也就是说,您并不是说只有 可以应用第一个子句:

?- 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.