Понимание пролога [списки]

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

?- 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.
Другие вопросы по тегам