loops - 结果后的 Prolog 循环

标签 loops prolog declarative failure-slice declarative-programming

所以我写了这个谓词来查找列表的所有可能的子集+排列。
我得到了正确的输出,但由于某种原因,程序在给我所有(正确)结果后继续循环。

我究竟做错了什么?

% Gets all subsets of a list
aSubset([], []).
aSubset([E|Tail], [E|NTail]):- aSubset(Tail, NTail).
aSubset([_|Tail], NTail):- aSubset(Tail, NTail).

% gets all subsets and permutates them
allSubsets([],[]).
allSubsets(X, Res) :- permutation(S, Res), aSubset(X, S).

我为 allSubsets([1,2,3], X) 得到的结果是:
4 ?- allSubsets([1,2,3], X).
X = [] ;
X = [1] ;
X = [2] ;
X = [3] ;
X = [1,2] ;
X = [1,3] ;
X = [2,3] ;
X = [2,1] ;
X = [3,1] ;
X = [3,2] ;
X = [1,2,3] ;
X = [1,3,2] ;
X = [2,1,3] ;
X = [2,3,1] ;
X = [3,1,2] ;
X = [3,2,1] ;
Action (h for help) ? abort
% Execution Aborted

我必须在最后两行中止循环。

提前致谢。

最佳答案

不仅allSubset([1,2,3], X)循环,但还有更短的 allSubset([], X) .

以下程序片段 ( failure-slice ) 已经循环。所以没有必要再看下去了。

allSubsets([],[]) :- 假。
allSubsets(X, Res) :-
排列(S,Res),假,
子集(X,S)。

为了改善这一点,您需要更改可见部分的某些内容。目前,只有 Arg2 ( Res ) 可以影响目标 permutation(S, Res) , Arg1 ( X ) 仅出现在第二个目标中,此时影响(普遍)第一个目标的终止已经太晚了。

关于loops - 结果后的 Prolog 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27441481/

相关文章:

c - 即使条件不为真,C 中的 while 循环也会退出

python - 如何在python中迭代多个字典中的json键、值

javascript - 条件语句中的 for 循环未定义数组索引

haskell - 在 Haskell 中将 foldr 与 OR 混合(懒惰?)

ASP.NET 母版页 : how to insert markup in the head section inside the aspx?

python - 获取列表中字符串类型的最后一个元素

prolog - 如何在 Prolog 中实现 SKI 组合子?

parsing - 如何在Prolog中做解析器?

prolog - 取决于未能在序言中证明

python - 如果存在唯一键,则 SQLAlchemy 更新