prolog - 数组的子序列 - 每个结果恰好一次

时间:2016-05-14 12:20:48

标签: list prolog

在这里,您可以看到我的实施:

subsequence([], _).   
subsequence([H1|T1], [H1|T2]) :- subsequence(T1, T2).
subsequence(L1, [_|T2]) :- subsequence(L1, T2).

例如,

?- subsequence(X, [1,2]).
X = [] ;
X = [1] ;
X = [1, 2] ;
X = [1] ;
X = [] ;
X = [2] ;
X = [] ;  

这个结果一般都没问题,不过我想得到类似的东西:

39 ?- subsequence(X, [1,2]).
X = [] ;
X = [1] ;
X = [1, 2] ;
X = [2] ;

(顺序无所谓)
正如你所看到的,我的目标是重复。怎么做 ?我试图分析计算树 - 我确实设法重新构建了这个结果。但是,我仍然无法重复。 (这棵树对我没有帮助)。

2 个答案:

答案 0 :(得分:3)

由于subsequence/2的条款在第一个参数为[]时不相互排斥,因此存在重复的解决方案。 subsequence([], X)有多种方法可以成功。它匹配或成功通过谓词的第一个和第三个子句。

您可以修改第三个子句以避免[]是第一个参数的情况,在这种情况下使子句互斥:

subsequence([], _).   
subsequence([X|T1], [X|T2]) :- subsequence(T1, T2).
subsequence([X|T1], [_|T2]) :- subsequence([X|T1], T2).

然后会产生:

| ?- subsequence(X, [1,2]).

X = [] ? a

X = [1]

X = [1,2]

X = [2]

no
| ?-

<小时/> 完成上述操作的另一种方法是将第三个​​谓词子句(保留上面的前两个)定义为:

subsequence(L, [_|T]) :-
    L = [_|_],    % L is a list with at least one element
    subsequence(L, T).

答案 1 :(得分:0)

更改第一个子句就足够了。 []的子序列应为[],而不是“任何”。

subsequence([], []).   
subsequence([H1|T1], [H1|T2]) :- subsequence(T1, T2).
subsequence(L1, [_|T2]) :- subsequence(L1, T2).