2015-09-29 4 views
2

Я пытаюсь создать список случайной длины, используя библиотеки lists и clpfd. Я попробовал следующее:Создайте списки всех длин между пределами

?- use_module(library(clpfd)). 
?- use_module(library(lists)). 

gen_mem_burst(X) :- 
    Len in 1..2, 
    length(X, Len). 

Я вижу, что Пролог первым находит решение только с одним элементом списка, то решением с двумя элементами, так же, как я ожидал. Впоследствии он выдает сообщение «из глобального стека». Я проследил его, и я заметил, что он пытается установить Len на 3, 4, 5, ... и так далее. Как я могу заставить его остановиться?

Я новичок в Prolog, и я даже не уверен, что это действительная модель использования. В других языках с ограничениями, которые я использовал (например, SystemVerilog), это легко возможно.

ответ

2

По крайней мере, с SWI-Prolog, length/2 работает не так, как ожидалось, когда задействованы ограниченные переменные: я застрял на exact same problem. Есть несколько хороших ответов, которые могут дать вам указатели.

Во всяком случае, отвечая на название вашего вопроса: формирование списка произвольной длины:

?- set_random(seed(1)), /* if you want to seed */ 
    Len is random(9), 
    length(L, Len). 
Len = 2, 
L = [_G2748, _G2751]. 

Если вам просто нужно создать список всех длины между двумя крайними,

?- between(1, 3, Len), length(L, Len). 

, вероятно, самый простой способ.

+1

Я думаю, что я выбрал название плохо. Мое намерение состоит в том, чтобы иметь возможность генерировать все возможности (i, e, списки длины 1 и списки длины 2). Я использовал метод 'fd_length (..)' из вашей ссылки. –

+0

@ Tudor Хм, все еще не уверен. Вы абсолютно хотите использовать для этого ограниченную переменную? См. Обновление для моего ответа, чтобы сделать это без него. 'Fd_length/2', как ни странно, является излишним, если вам действительно не нужно устанавливать ограничение CLP (FD) на длину списка. –

+1

Использование 'between' еще более круто для моих требований (так как мне просто нужно подметать), но хорошо иметь в виду подход' fd_length/2', когда мне понадобится добавить более сложные ограничения для длины списка. –

 Смежные вопросы

  • Нет связанных вопросов^_^