Пролог: между/3 со списком в конце

мой вопрос возникает из-за этого вопроса Можете ли вы написать между/3 в чистом виде? пролог?

можно ли сделать так, чтобы между /3 и третьим аргументом был список, поэтому, если вы спросите

between(2,6,X).

приходит

X=[2,3,4,5,6]

и не нравится

X=2
X=3
X=4
....

Я не могу понять, как это должно работать (все мои решения не работают..) Я новичок в Prolog, поэтому понятия не имею..

извините за плохой английский..

Спасибо за вашу помощь :)


person user3090164    schedule 11.12.2013    source источник


Ответы (1)


Для начала сходите в библиотеку и возьмите хорошую книгу, например «Искусство Пролога» Стерлинга и Шапиро.

Два пути:

?- findall(X, between(2, 6, X), Xs).
Xs = [2, 3, 4, 5, 6].

Вы также должны взглянуть на bagof/3 и setof/3.

Прямой путь, numlist/3, см., например, в Реализация SWI-Prolog. Без проверки аргументов это сводится к:

numlist(U, U, List) :- !,
    List = [U].
numlist(L, U, [L|Ns]) :-
    L2 is L+1,
    numlist(L2, U, Ns).

Есть несколько способов сломать предикат в его нынешнем виде.

?- numlist(1,0,L).

не прекратится. Вам нужно либо проверить аргументы, прежде чем передавать их в эту конкретную версию numlist/3:

must_be(integer, L),
must_be(integer, U),
L =< U

Эти проверки включены в библиотечный предикат numlist/3 из связанной реализации SWI-Prolog.

person Community    schedule 11.12.2013