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] ;
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] ;