Оператор "Меньше или равно" в Прологе - =<
, а не <=
.(Причина этого, как указано в комментариях, заключается в том, что <=
выглядит слишком похоже на стрелку импликации и ее не следует путать с ней.)
Я не знаю о вашей системе прологов, но SWI Prolog выдает мне ошибку компиляции с вашим кодом: «Ожидается оператор», потому что он не знает об операторе <=
.
После смены оператора я действительно получаю результат.Однако предикат, как он есть, недетерминирован , то есть вы не сказали, что 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.