prolog中列表的公共子序列

prolog中列表的公共子序列,prolog,Prolog,我试图编写一个公共谓词(L,S),它从L中的列表列表中生成L中列表的所有公共子序列 subseq([], _). subseq([H|S], L) :- append(_, [H|T], L), subseq(S, T). common(L, X) :- not(( member(A, L), not(subseq(X, A)) )). 即使输入错误,它也只会给我“真” 例如: common([[1,2,3,4],[2,3],[12]],X)。

我试图编写一个公共谓词(L,S),它从L中的列表列表中生成L中列表的所有公共子序列

subseq([], _).
subseq([H|S], L) :- append(_, [H|T], L), subseq(S, T).


common(L, X) :- not((
        member(A, L),
        not(subseq(X, A))
       )).
即使输入错误,它也只会给我“真”

例如:

common([[1,2,3,4],[2,3],[12]],X)。
真的

编辑


我注意到它实际上是起作用的,但它并没有用谓词为真的术语来代替X

子字符串是后缀的非空前缀

substring_of(Ys, Xs) :-
   Ys = [_|_],           %  a non-empty
   append(_, Zs, Xs),    %                       a suffix of Xs
   append(Ys, _, Zs).    %             prefix of 

common(Xss, Xs) :-       % Xs is a substring of each element of Xss
   maplist(substring_of(Xs), Xss).

?- common([[1,2,3,4], [2,3,4,5]], Xs).
Xs = [2] ;
Xs = [2, 3] ;
Xs = [2, 3, 4] ;
Xs = [3] ;
Xs = [3, 4] ;
Xs = [4] ;
false.

你说“是”是什么意思?你能给出确切的查询吗?此外,这是合乎逻辑的:序言中的否定不是建设性的。所以它将返回true或false。是的,对此表示抱歉。我已经编辑了这篇文章,添加了一个示例查询。此外,您想要所有公共子序列吗?因为这是一个困难的问题(就计算复杂性而言)。请用几个例子(输入和预期输出)说明你的目标。请注意a是不同的!您需要的是所谓的子字符串或子列表。谢谢,我已经忘记了。但即使将subseq的定义更改为
subseq([],41;)。subseq([H | S],L):-append([H | T],L),subseq(S,T)。
其行为方式仍然相同。我注意到,当我给它精确的值时,它工作正常,但当试图用结果替换X时,它不起作用。它只会给出“是”