子列表的序言长度不返回长度但返回假?
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.
所以不确定为什么我的代码不起作用。但是我试图在给定下限和上限的情况下找到子列表的长度我有这个。
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.