编程语言 – 反向推理引擎(找到foo(X)为真的随机X)

我知道像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)是真的(因此它应该根据一些随机种子给我一个’socrates’,’plato’或’aristotle’.

我的问题是:

>这种反向推理是否有名称?
>是否有支持它的语言或库?

编辑

正如下面的某些人指出的那样,你可以简单地问凡人(X),它会返回所有的X,你可以从中轻轻地从列表中选择一个.但是,如果该列表非常大,可能是数十亿呢?显然,在这种情况下,在选择一个之前不会产生所有可能的结果.

要想看这是一个实际问题,想象一个简单的语法,它产生一个形式为“adjective1 noun1 adverb transitive_verb adjective2 noun2”的随机句子.如果形容词,名词,动词等的列表非常大,你可以看到组合爆炸是一个问题.如果每个列表有1000个单词,那么你有1000 ^ 6个可能的句子.

最佳答案 可以轻松实现随机深度优先搜索策略,而不是深入研究Prolog.所需要的只是在选择点随机化程序流,以便每次达到分离时,选择搜索树(= prolog程序)上的随机极点而不是第一个.

但是,请注意,这种方法并不能保证所有解决方案都是同等可能的.为了保证这一点,需要事先知道每个极点将产生多少解决方案以相应地对随机化进行加权.

点赞