在这里,您可以看到我的实施:
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] ;
(顺序无所谓)
正如你所看到的,我的目标是重复。怎么做 ?我试图分析计算树 - 我确实设法重新构建了这个结果。但是,我仍然无法重复。 (这棵树对我没有帮助)。
答案 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).