Prolog 包含的列表(列表1、列表2)

Prolog 包含的列表(列表1、列表2),prolog,dcg,Prolog,Dcg,当list1是list2的一部分时,included_list为true 比如说, included_list([1,2],[1,2,3,4]) is true. included_list([2,1],[1,2,3,4]) is false. included_list([],[1,2,3,4]) is false. included_list([1,1,1,1,1,1],[1,2,3,4]) is false. 为了得到这个答案,我应该写什么谓词 我试过这个: included_list

当list1是list2的一部分时,included_list为true

比如说,

included_list([1,2],[1,2,3,4]) is true. 
included_list([2,1],[1,2,3,4]) is false.
included_list([],[1,2,3,4]) is false.
included_list([1,1,1,1,1,1],[1,2,3,4]) is false.
为了得到这个答案,我应该写什么谓词

我试过这个:

included_list([Head],List).

included_list([Head1|Tail1],[Head2|Tail2]) :-
                    member(Head1,[Head2]),included_list(Tail1, Tail2).
但是当我询问included_list[1,1,1,1,1,1],[1,2,3,4]时,它返回true

如果可能的话,我想在没有内置库的情况下完成它。

使用一个

包括以下内容:- Substr=[124; 124;],, 短语…,seqSubstr,如下。 ... -> [] | [_], ... . seq[]->[]。 序号[E|Es]> [E] ,, 塞克斯。 用一把枪

包括以下内容:- Substr=[124; 124;],, 短语…,seqSubstr,如下。 ... -> [] | [_], ... . seq[]->[]。 序号[E|Es]> [E] ,, 塞克斯。 1-include1谓词创建List2的所有可能子集,然后检查List1是否在这些子集中。如果是,则它出现在列表2中;如果不是,则它不存在

2-为了创建子集splitSet,使用了permute和omit谓词

include1([H1|T1],[H2|T2]):-
    splitSet([H2|T2],_,Sublist),
    Sublist=[_|_], %disallowing empty list
    permute(Sublist,M),
    [H1|T1]=M.

splitSet([ ],[ ],[ ]).
splitSet([H|T],[H|L],R) :-
    splitSet(T,L,R).
splitSet([H|T],L,[H|R]) :-
    splitSet(T,L,R).

permute([ ],[ ]) :- !.
permute(L,[X|R]) :-
    omit(X,L,M),
    permute(M,R).

omit(H,[H|T],T).
omit(X,[H|L],[H|R]) :-
    omit(X,L,R).
测试用例的示例:

对于这种情况,[2,1],[1,2,3,4]为真,因为[1,2,3,4]将生成具有[2,1]的子集。

1-include1谓词创建列表2的所有可能子集,然后检查列表1是否在这些子集中。如果是,则它出现在列表2中;如果不是,则它不存在

starts_with([H], [H|_]).
starts_with([H|T1], [H|T2]) :- starts_with(T1, T2).

included_list(X, Y) :- starts_with(X, Y).
included_list(X, [_|T]) :- included_list(X, T).
2-为了创建子集splitSet,使用了permute和omit谓词

include1([H1|T1],[H2|T2]):-
    splitSet([H2|T2],_,Sublist),
    Sublist=[_|_], %disallowing empty list
    permute(Sublist,M),
    [H1|T1]=M.

splitSet([ ],[ ],[ ]).
splitSet([H|T],[H|L],R) :-
    splitSet(T,L,R).
splitSet([H|T],L,[H|R]) :-
    splitSet(T,L,R).

permute([ ],[ ]) :- !.
permute(L,[X|R]) :-
    omit(X,L,M),
    permute(M,R).

omit(H,[H|T],T).
omit(X,[H|L],[H|R]) :-
    omit(X,L,R).
测试用例的示例:

对于这种情况,[2,1],[1,2,3,4]为真,因为[1,2,3,4]将生成一个子集[2,1]

starts_with([H], [H|_]).
starts_with([H|T1], [H|T2]) :- starts_with(T1, T2).

included_list(X, Y) :- starts_with(X, Y).
included_list(X, [_|T]) :- included_list(X, T).
测试:

?- included_list([], [1, 2, 3, 2, 1]).
false.

?- included_list([2, X], [1, 2, 3, 2, 1]).
X = 3 ;
X = 1 ;
false.
版本2,删除@rajashekar的代码:

included_list([X|Y], L2) :- append(T, _, L2), append(_, [X|Y], T).
测试:

?- included_list([], [1, 2, 3, 2, 1]).
false.

?- included_list([2, X], [1, 2, 3, 2, 1]).
X = 3 ;
X = 1 ;
false.
版本2,删除@rajashekar的代码:

included_list([X|Y], L2) :- append(T, _, L2), append(_, [X|Y], T).

谢谢你的回答,但如果是这样的话,我想不使用内置库possible@Giannis_00:您正在使用内置的会员/2…您是对的,但我更愿意使用另一种方式,我之所以这样发帖是因为我想让大家更了解这个问题谢谢你的回答,但如果是这样的话,我想在没有内置库的情况下发帖possible@Giannis_00:您正在使用内置的会员/2…您是对的,但我更愿意使用另一种方式,我只是用这种方式发布,因为我想让大家更了解这个问题,为什么包含在列表[],[1,2,3,4]中是假的?我只是想用这种方式发布。这样行吗?subseqL1,L2:-append,u2,append,1,L1,T.@rajashekar我喜欢它,尽管OP希望subseq[],失败。为什么包含的列表[],[1,2,3,4]是假的?我只想这样做。这样行吗?subseqL1,L2:[2,1,3,4]@Giannis_00没有问题:谢谢你的回答:,现在我试图找到一种方法为[2,1],[1,2,3,4]@Giannis_00提供假答案:,现在我尝试为[2,1],[1,2,3,4]@Giannis_00提供假答案:,谢谢你的回答:,现在我试图找到一种方法为[2,1],[1,2,3,4]@Giannis_00提供假答案:没问题:你太棒了,非常感谢,它起作用了:你太棒了,非常感谢,它起作用了: