Понимание пролога [списки]
Я должен написать программу, которая делает это:
?- pLeap(2,5,X,Y).
X = 2,
Y = 3 ;
X = 3,
Y = 4 ;
X = 4,
Y = 5 ;
X = 5,
Y = 5 ;
false.
(дает все пары X,X+1 между 2 и 5, а также особый случай в конце).
Это якобы решение. Я не очень понимаю, как это работает, кто-нибудь может направить меня через это?
pLeap(X,X,X,X).
pLeap(L,H,X,Y) :-
L<H,
X is L,
Y is X+1.
pLeap(L,H,X,Y) :-
L=<H,
L1 is L+1,
pLeap(L1,H,X,Y).
Я бы сделал это просто так:
pLeap(L,H,X,Y) :-
X >= L,
X =< H,
Y is X+1.
Почему это не работает (игнорируя особый случай в конце)?
2 ответа
>=
а также =<
операторы не создают свои аргументы, и вы можете использовать их только после того, как аргументы уже созданы.
Другими словами, в данном решении X
а также Y
даны значения с is
и <
а также =<
операторы используются только на L
а также H
, чьи значения задаются пользователем. (По данному решению попробуйте pLeap(L,H,2,3)
и вы получите ту же проблему, что и у вас.)
В вашем случае, однако, вы пытаетесь использовать >=
а также =<
на X
, который еще не имеет значения, и поэтому переводчик жалуется.
Вы можете использовать библиотеку clpfd для вашей проблемы.
:- use_module(library(clpfd)).
pLeap(L,H,X,Y) :-
X in L..H,
Y #= min(H, X+1),
label([X]).
Вот вывод:
?- pLeap(2,5,X,Y).
X = 2,
Y = 3 ;
X = 3,
Y = 4 ;
X = 4,
Y = 5 ;
X = 5,
Y = 5.