所以不确定我的代码为什么不起作用。但是我试图找到给定下限和上限的子列表的长度。
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).
但返回错误,不确定原因。
答案 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.