Prolog 子集生成

Prolog subsets generation

this问题很好地回答了如何生成子集的问题。我的问题是为什么我的代码没有。我自己对这个问题的尝试是

subset2(_, []).
subset2(Set, [S|Subset]) :- member(S, Set), not(member(S, Subset)), subset2(Set, Subset).

虽然这确实可以正确测试子集,但它只会生成空集。这是为什么?

not(member(S, Subset)) 出现在 Subset 具有任何已知值之前。在那种情况下,它说“我们对 Subset 了解的一件事是它是一个包含 S 的列表!”。您告诉 Prolog 将 S 放入子集中,然后询问这样做是否失败。

例如它将在列表中填充未知变量:

?- member(horse, [cat, dog, sheep, PLACEHOLDER, cow, pig]).
PLACEHOLDER = horse

提问:

  • 马和猫合一吗?没有。
  • 马与狗合一吗?没有。
  • 马与羊合一吗?没有。
  • 马与 PLACEHOLDER 统一吗?是的!未初始化的变量可以与原子统一,已解决!

或者它可以在每个位置生成越来越长的列表:

?- member(horse, ANIMALS).
ANIMALS = [horse|_1690] ;
ANIMALS = [_1408, horse|_1416] ;
ANIMALS = [_1408, _1414, horse|_1422] ;
ANIMALS = [_1408, _1414, _1420, horse|_1428] ;