List 如何在Prolog中创建子列表

List 如何在Prolog中创建子列表,list,prolog,List,Prolog,在prolog中我将如何执行此操作 我已经得到了这个来创建子列表,但是现在需要确保第二个列表的第一个和最后一个元素不包括在第一个列表中 sublist(S,L):- append(_,L2,L), append(S,_,L2). 我的做法如下:- sub([],[]). sub(S,A):- append(_L1,L2,A), append(S1,_L3,L2), removefirstelement(S1,S2),

在prolog中我将如何执行此操作

我已经得到了这个来创建子列表,但是现在需要确保第二个列表的第一个和最后一个元素不包括在第一个列表中

sublist(S,L):- append(_,L2,L), append(S,_,L2).
我的做法如下:-

    sub([],[]).
    sub(S,A):- 
        append(_L1,L2,A),
        append(S1,_L3,L2),
        removefirstelement(S1,S2),
        removelastelement(S,S2).
    
    removefirstelement([_|T],T).
    removelastelement([],[_]).
    removelastelement([X|Xs], [X,Next|T]) :- 
        removelastelement(Xs, [Next|T]).

?-sub(S,[a,b,c,d,e]).
S = []
S = [b]
S = [b, c]
S = [b, c, d]
S = []
S = [c]
S = [c, d]
S = []
S = [d]
S = []
只需添加removefirstelement和RemoveLasteElement谓词。

以下是我的方法:-

    sub([],[]).
    sub(S,A):- 
        append(_L1,L2,A),
        append(S1,_L3,L2),
        removefirstelement(S1,S2),
        removelastelement(S,S2).
    
    removefirstelement([_|T],T).
    removelastelement([],[_]).
    removelastelement([X|Xs], [X,Next|T]) :- 
        removelastelement(Xs, [Next|T]).

?-sub(S,[a,b,c,d,e]).
S = []
S = [b]
S = [b, c]
S = [b, c, d]
S = []
S = [c]
S = [c, d]
S = []
S = [d]
S = []

只需添加removefirstelement和RemoveLasteElement谓词。

您可以使用模式匹配,使头部和尾部不为空:

sublist(S,L) :-
    append([_|_],L2,L),
    append(S,[_|_],L2).

因此,在第一个append/3中,我们确保子列表前的部分为非空,在第二个append/3中,我们确保子列表后的部分为非空。

您可以使用模式匹配,以便头部和尾部为非空:

sublist(S,L) :-
    append([_|_],L2,L),
    append(S,[_|_],L2).

因此,在第一个append/3中,我们确保子列表前的部分为非空,在第二个append/3中,我们确保子列表后的部分为非空。

请在问题中包括实际问题和您的代码。不是图像而是文本。请在问题中包含实际问题和您的代码。不是图片,而是文字。非常感谢!我理解removefirstelement函数,但您能否详细说明RemoveLasteElement函数的作用?我对这种语言很陌生。@leximus,RemovelAsteElement接受两个参数,表示S和S2,S2来自remove第一个元素。这里现在是空的。当我们给出RemovelAsElement时,这些值S变成[X | Xs],S2变成[X,Next | T]。注意,当我们写[H | T]时,它意味着一个头值,T是剩余的列表,因此X是头值,Next是X的下一个数字,T是尾。同样,Xs也是一条尾巴。所以[X,Next | T]是删除第一个元素后得到的列表。现在有了这个列表,我们正在用[Next | Tail]更新它,并将值提供给Xs,它将更新S的结果。非常感谢!我理解removefirstelement函数,但您能否详细说明RemoveLasteElement函数的作用?我对这种语言很陌生。@leximus,RemovelAsteElement接受两个参数,表示S和S2,S2来自remove第一个元素。这里现在是空的。当我们给出RemovelAsElement时,这些值S变成[X | Xs],S2变成[X,Next | T]。注意,当我们写[H | T]时,它意味着一个头值,T是剩余的列表,因此X是头值,Next是X的下一个数字,T是尾。同样,Xs也是一条尾巴。所以[X,Next | T]是删除第一个元素后得到的列表。现在有了这个列表,我们用[Next | Tail]更新它,并将值提供给Xs,Xs将更新S的结果。