длина пролога подсписка не возвращает длину, но возвращает false? - PullRequest
0 голосов
/ 03 декабря 2018

поэтому не уверен, почему мой код не работает.Но я пытаюсь найти длину подсписка, учитывая нижнюю границу и верхнюю границу, у меня есть это.

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 голосов
/ 03 декабря 2018

Оператор "Меньше или равно" в Прологе - =<, а не <=.(Причина этого, как указано в комментариях, заключается в том, что <= выглядит слишком похоже на стрелку импликации и ее не следует путать с ней.)

Я не знаю о вашей системе прологов, но 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.
...