Понимание пролога [списки] - PullRequest
2 голосов
/ 27 апреля 2010

Я должен написать программу, которая делает это:

?- 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 ]

4 голосов
/ 28 апреля 2010

Вы можете использовать библиотеку 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.
2 голосов
/ 27 апреля 2010

Операторы >= и =< не создают свои аргументы, и вы можете использовать их только после того, как аргументы уже созданы.

Другими словами, в данном решении X и Y задаются значения с is, а операторы < и =< используются только для L и H, чьи значения даны пользователем. (В данном решении попробуйте pLeap(L,H,2,3), и вы получите ту же проблему, что и у вас.)

В вашем случае, однако, вы пытаетесь использовать >= и =< на X, который еще не имеет значения, и поэтому переводчик жалуется.

...