Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ProLog中select/3的改进_Select_Prolog - Fatal编程技术网

ProLog中select/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

我想通过在给定列表中选择多个元素(而不是一个)来改进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 = [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.:)