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])
。有一条评论说明了该程序的功能。如何让代码做它应该做的事情
我还问了一个关于相同但完全不起作用的代码的问题:在解决这个问题时,你应该考虑六个相互排斥的情况:
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).