Я написал это как способ помочь ограничить решения, даже если есть бесконечные решения.Но я понял, что будет способ изменить правила, чтобы сначала получить более короткие результаты.
Поскольку ad --> a, ad, d.
оценивается до ad --> bc.
, он пытается удовлетворить ad --> a, ad, a.
до ad --> bc.
.Я бы поставил ad --> bc.
перед ad --> a, ad, a.
.То же самое относится к bc --> b, b, bc, c, c.
и bc --> [].
правилам
Как указал Ариан, сначала применяются правила завершения, гарантировавшее, что более короткие решения будут найдены первыми.
Я также хочу указатьиз того, что есть два решения для []
s и s -> ad -> bc -> [], я бы исключил s --> [].
, поскольку это избыточно.
В общем, я бы попробовал это решение:
s --> ad.
a --> [a].
b --> [b].
c --> [c].
d --> [d].
ad --> bc.
bc --> [].
ad --> a, ad, d.
bc --> b, b, bc, c, c.
ОРИГИНАЛЬНАЯ ПОЧТА:
Мне пришлось посмотреть, как делать подсчет (прошло много времени с тех пор, как я пролог). Но существует бесконечное число, и, поскольку пролог пытается найти все решения, этоникогда не перестанет искать, хотя я уверен, что вы столкнетесь с потоком стека или какой-то ошибкой до этого момента:).
Один из способов ограничить количество результатов - ограничить размер решения
phrase(s, X), length(X, 4).
Получает все решения с ровно 4 значениями, которые будут
X = [a, a, d, d]
X = [b, b, c, c]
, увеличившись до 6, что приведет к:
X = [a, a, a, d, d, d]
X = [a, b, b, c, c, d]
Или используйте диапазоны:
phrase(s, X), length(X, Y), Y >= 4 , Y < 10, Y != 6.