【发布时间】:2023-03-24 08:05:01
【问题描述】:
我有一个序言程序:
link(liverpool,preston).
link(liverpool,manchester).
link(preston,lancaster).
link(preston,manchester).
link(lancaster,carlisle).
link(lancaster,leeds).
link(carlisle,leeds).
link(manchester,leeds).
%checks to see if X is in the supplied list
inlist( X, [X|_]).
inlist( X, [_|Ys]) :- inlist( X, Ys).
merge([],L,L).
merge([H|T],BList,CList):-
inlist(H,BList),
merge(T,BList,CList).
merge([H|T],BList,[H|CList]):-
merge(T,BList,CList),
not(inlist(H,BList)).
如果我这样称呼它,合并就可以工作:
merge([a,b,c],[d,e,f],Result). --> [a,b,c,d,e,f]
或更重要的是,它旨在解决什么问题:
merge([a,b,c],[a,d,e,f],Result). --> [a,b,c,d,e,f]
但如果我这样调用合并:
merge(X,[d,e,f],[a,b,c,d,e,f]).
堆栈溢出。对于设计为以一种方式工作的功能,这是通常可接受的行为吗?还是有一些约定,函数应该以两种方式工作?
编辑:如果你这样称呼它,合并就可以工作:
merge([a,b,c],X,[a,b,c,d,e,f]). --> [d,e,f]
【问题讨论】: