ProLog中select/3的改进
我想通过在给定列表中选择多个元素(而不是一个)来改进prolog中的select/3。例如,如果在此列表中选择X=1和Y=2,[1,2,3],则结果将为[3] 以下是我目前掌握的情况:ProLog中select/3的改进,select,prolog,Select,Prolog,我想通过在给定列表中选择多个元素(而不是一个)来改进prolog中的select/3。例如,如果在此列表中选择X=1和Y=2,[1,2,3],则结果将为[3] 以下是我目前掌握的情况: select_pair(X,Y,[X|Xs],Xs) :- member(Y,Xs). select_pair(X,Y,[H|T1],[H|T2]) :- select_pair(X,Y,T1,T2). 结果是: ?- select_pair(X,Y,[1,2,3],Zs). X = 1, Y = 2, Zs
select_pair(X,Y,[X|Xs],Xs) :- member(Y,Xs).
select_pair(X,Y,[H|T1],[H|T2]) :- select_pair(X,Y,T1,T2).
结果是:
?- select_pair(X,Y,[1,2,3],Zs).
X = 1,
Y = 2,
Zs = [2, 3] ;
X = 1,
Y = 3,
Zs = [2, 3] ;
X = 2,
Y = 3,
Zs = [1, 3] ;
然而,正确的结果应该是Zs=[3]、[2]、[1]。我知道我必须以某种方式将这两个值相交在一起;因此,以下是相交方法:
intersect([],M,[]).
intersect([X|L],M,[X|I]) :- member(X,M), intersect(L,M,I).
intersect([X|L],M,I) :- \+ member(X,M), intersect(L,M,I).
我想我必须用intersect方法而不是member方法
有人能帮帮我吗?你太近了!使用
select/3
而不是member/2
:
select_pair(X, Y, [X|Xs], Result) :- select(Y, Xs, Result).
select_pair(X, Y, [H|T1], [H|T2]) :- select_pair(X,Y,T1,T2). % unmodified
?- select_pair(X, Y, [1,2,3], Z).
X = 1,
Y = 2,
Z = [3] ;
X = 1,
Y = 3,
Z = [2] ;
X = 2,
Y = 3,
Z = [1] ;
false.
作为比较,我很想这样编写:
select_pair(X, Y, In, Out) :-
select(X, In, Mid), select(Y, Mid, Out).
select_pair(X, Y, In, Out) :- intersection([X,Y], Out, In).
这实际上产生了排列而不是组合,我推断这不是你想要的
我认为你无法让intersect解决这个问题。直觉上,你想做的事情是这样的:
select_pair(X, Y, In, Out) :-
select(X, In, Mid), select(Y, Mid, Out).
select_pair(X, Y, In, Out) :- intersection([X,Y], Out, In).
问题是上面的
intersect/3
或SWI内置的intersection/3
都不会生成这样的结果。他们为什么不这样做是有道理的:无法根据两组数据的交集来知道它们的内容,因为这些数据根本不存在。非常感谢你,Daniel Lyons。这是非常有帮助的!没问题,希望您喜欢使用Prolog.:)