Prolog 如何绕过将空列表分配给过程';形式为[X | L]的s参数?

Prolog 如何绕过将空列表分配给过程';形式为[X | L]的s参数?,prolog,Prolog,我有以下计划: % finds all members in sorted list L1 that are not in the sorted L2 % and puts them in NL make_list(L1,L2,NL):- make_list(L1,L2,NL,x). make_list([],_,[],_):-!. % X represents the last value parsed from L1 make_list(L1,[],L2,X):-!,

我有以下计划:

% finds all members in sorted list L1 that are not in the sorted L2 
%   and puts them in NL
make_list(L1,L2,NL):-
    make_list(L1,L2,NL,x).
make_list([],_,[],_):-!.

% X represents the last value parsed from L1
make_list(L1,[],L2,X):-!,
    make_list(L1,[99999999],L2,X).

make_list([X1|L1],[X2|L2],[X3|NewL],Last):-
    (
        (X1<X2,
         X1 \= Last,
         X3=X1,!,
         make_list(L1,[X2|L2],NewL,X1);
         X1<X2,!,
         make_list(L1,[X2|L2],[X3|NewL],X1)
         )
    );
    (
        X1=X2,!,
        make_list(L1,[X2|L2],[X3|NewL],*)
    );
    make_list([X1|L1],L2,[X3|NewL],*).

它将至少包含一个变量的列表(第三个列表)传递给
make\u list([],[u],[],[u])
。有一条评论说明了该程序的功能。如何让代码做它应该做的事情


我还问了一个关于相同但完全不起作用的代码的问题:
  • 两个列表中的元素都已用完
  • 第一个列表中的元素用完了,但第二个列表中的元素没有
  • 第二个列表中的元素用完了,但第一个列表中的元素没有
  • 两个列表都至少有一个元素,并且head元素匹配
  • 两个列表都至少有一个元素,第一个列表的head元素较小
  • 两个列表都至少有一个元素,第一个列表的head元素更大
  • 这六个组合涵盖了您需要编写的规则

    前两种情况可由一条规则涵盖:

    make_list([], _, []).
    
    这意味着,如果第一个列表为空,则输出列表中将没有任何内容可添加

    第三种情况也很简单:如果第二个列表为空,则输出与第一个列表相同:

    make_list(L1, [], L1).
    
    第四种情况稍微不那么琐碎:如果两个头统一起来,将它们同时放下,然后解决一个较小的子问题:

    make_list([H|T1], [H|T2], NL) :-
        make_list(T1, T2, NL).
    
    案例5将第一个列表的头插入到输出中,案例6跳过第二个列表的头:

    make_list([H1|T1], [H2|T2], NL) :-
        H1 < H2,
        make_list(T1, [H2|T2], N2),
        NL = [H1|N2].
    
    make_list([H1|T1], [H2|T2], NL) :-
        H1 > H2,
        make_list([H1|T1], T2, NL).
    
    make|u列表([H1|T1]、[H2|T2]、NL):-
    H1H2,
    制作列表([H1 | T1],T2,NL)。
    
    请注意,当第一个列表包含重复项,而第二个列表不包含对应元素的重复项时,此解决方案无法按预期工作

    % finds all members in sorted list L1 that are not in the sorted L2 
    % and puts them in NL
    
    make_list(L1,L2,NL):-
        make_list(L1,L2,NL,x).
    
    make_list([],_,[],_):-!.
    
    % X represents the last value parsed from L1
    make_list(L1,[],L2,X):-!,
        make_list(L1,[99999999],L2,X).
    
    这里的问题是
    NewL
    [X3 | NewL]
    并且当
    L1
    为空时,
    make_列表([],[uu],[uu],[uu]:-失败,因为
    [X3 | NewL]
    无法使用
    []

    make_list([X1|L1],[X2|L2],NewL,Last):-
        X1<X2,
        X1 \= Last,
        NewL = [X3|NewL2],X3=X1,
        make_list(L1,[X2|L2],NewL2,X1),!
        ;
        X1<X2,
        make_list(L1,[X2|L2],NewL,X1),!.
    
    make_list([X1|L1],[X1|L2],NewL,Last):-!,
        make_list(L1,[X1|L2],NewL,Last).
    

    这是一个家庭作业/自学吗?我想我发现了这个问题,我希望明天能有更多的时间来更深入地探索它。@VitaliPom我用一个简单的例子
    制作列表([0,1,3,5,7],[1,5],X)
    ,它产生了
    [0,3,7]
    。但是如果你发现了一个错误,请告诉我你的测试用例。
    % finds all members in sorted list L1 that are not in the sorted L2 
    % and puts them in NL
    
    make_list(L1,L2,NL):-
        make_list(L1,L2,NL,x).
    
    make_list([],_,[],_):-!.
    
    % X represents the last value parsed from L1
    make_list(L1,[],L2,X):-!,
        make_list(L1,[99999999],L2,X).
    
    make_list([X1|L1],[X2|L2],NewL,Last):-
        X1<X2,
        X1 \= Last,
        NewL = [X3|NewL2],X3=X1,
        make_list(L1,[X2|L2],NewL2,X1),!
        ;
        X1<X2,
        make_list(L1,[X2|L2],NewL,X1),!.
    
    make_list([X1|L1],[X1|L2],NewL,Last):-!,
        make_list(L1,[X1|L2],NewL,Last).
    
    make_list([X1|L1],[_|L2],NewL,X1):-!, % X1>X2
        make_list(L1,L2,NewL,X1).
    
    make_list([X1|L1],[_|L2],NewL,Last):- % X1>X2
        make_list([X1|L1],L2,NewL,Last).