Получение всех чисел из заданного интервала в Прологе - PullRequest
3 голосов
/ 10 октября 2011

Я новичок в мире Пролога, и я хотел бы написать правило, которое возвращает все элементы в определенном диапазоне.

Я собираюсь сделать что-то вроде

Пример:

foo(X, Low, High) :- X > Low, X < High.

И когда я набираю foo (X, 2, 5), он должен вернуть 3, а затем 4.

Кажется, что мой подход неправильный, и я хотел бызнать, как правильно это сделать.

Ответы [ 4 ]

6 голосов
/ 10 октября 2011

Когда написано так, Пролог не знает, какие цифры вы хотите (и хотите ли вы даже цифры).

Один из способов реализовать это будет:

range(X, L, H) :- X is L + 1, X < H.
range(X, L, H) :- L1 is L + 1, L1 < H, range(X, L1, H).
5 голосов
/ 10 октября 2011

простой ответ: between/3:

?- between(3,4,X).
X = 3 ;
X = 4.

реализация точного поведения довольно проста.

причиной того, что ваш подход не работает, является определение </2: оба аргумента должны быть созданы. поэтому, если вы хотите реализовать это без использования between/3, вы должны сделать что-то вроде предложения svick.

2 голосов
/ 10 октября 2011

Используя SWI-Prolog и library(clpfd), вы можете написать

:- use_module(library(clpfd)).

foo(X,Low,High) :-
    X #> Low,
    X #< High,
    label([X]).
1 голос
/ 11 октября 2011

Вы также можете сделать это (в значительной степени повторное выражение между / 3:

range( X , Y , Z ) :-
  integer(X) ,
  integer(Y) ,
  range1(X,Y,Z)
  .

range1( X , X , X ) .              % X equals Y
range1( X , Y , X ) :- X < Y .
range1( X , Y , Z ) :- X < Y , X1 is X+1 , range( X1 , Y , Z ) .
range1( X , Y , X ) :- X > Y .
range1( X , Y , Z ) :- X > Y , X1 is X-1 , range( X1 , Y , Z ) .
...