Мне известно, что такие языки, как Prolog, позволяют писать такие вещи как:
mortal(X) :- man(X). % All men are mortal
man(socrates). % Socrates is a man
?- mortal(socrates). % Is Socrates mortal?
yes
Я хочу что-то вроде этого, но в обратном направлении. Предположим, у меня есть это:
mortal(X) :- man(X).
man(socrates).
man(plato).
man(aristotle).
Затем я прошу дать мне случайный X, для которого смертный (X) истинен (таким образом, он должен дать мне один из «Сократ», «Платон» или «Аристотель» в соответствии с каким-то случайным семенем).
Мои вопросы:
- Имеет ли этот вид обратного вывода имя?
- Существуют ли языки или библиотеки, которые его поддерживают?
EDIT
Как заметил кто-то ниже, вы можете просто спросить смертного (X), и он вернет все X, из которых вы можете просто выбрать случайный из списка. Что если, однако, этот список будет очень большим, возможно, миллиардами? Очевидно, что в этом случае не нужно генерировать все возможные результаты, прежде чем выбрать один.
Чтобы увидеть, как это может быть практической проблемой, представьте простую грамматику, которая генерирует случайное предложение в форме «прилагательное1 существительное1 наречие transitive_verb прилагательное2 существительное2». Если списки прилагательных, существительных, глаголов и т. Д. Очень велики, вы можете увидеть, как комбинаторный взрыв является проблемой. Если бы в каждом списке было 1000 слов, у вас было бы 1000 ^ 6 возможных предложений.