4

したがって、リストのすべての可能なサブセット + 順列を見つけるために、この述語を書きました。正しい出力が得られますが、何らかの理由で、すべての (正しい) 結果が得られた後もプログラムがループし続けます。

私は何を間違っていますか?

% 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

最後の 2 行でループを中止する必要があります。

前もって感謝します。

4

2 に答える 2

4

ループだけでなくallSubset([1,2,3], X)、はるかに短いallSubset([], X).

次のプログラム フラグメント ( failure-slice ) は既にループしています。したがって、これ以上見る必要はありません。

allSubsets([],[]) :- false .
allSubsets(X, Res) :-
   permutation(S, Res), false ,
    aSubset(X, S) .

これを改善するには、目に見える部分で何かを変更する必要があります。現在、Arg2 ( Res) のみがゴールに影響を与えることができpermutation(S, Res)、Arg1 ( X) は 2 番目のゴールでのみ発生します。

于 2014-12-12T11:46:18.080 に答える