Prolog:在列表中,找到给定元素后面的元素

时间:2011-09-23 04:59:01

标签: list prolog

我最近开始在Prolog中编程,目前我正在尝试创建在列表中的给定元素之后找到元素的规则。例如,我希望find(2,X,[1,2,3,4]).生成3

到目前为止我的尝试:

find(X,Y,[X,Y|Tail]):-
   !.
find(X,Y,[_|Tail]):-
   find(X,Y,Tail).

3 个答案:

答案 0 :(得分:6)

让我们使用$(document).ready(function(){ $(document).on('change', '#valores input', function() { $('#valores input').not(this).prop('checked', false); }); }); 中的@ if_/3所定义的(=)/3equal_truth/3(a.k.a。find/3)!

所以这里出现了新的逻辑纯 find(E0,E1,[X|Xs]) :- member_next_prev_list(E0,E1,X,Xs). member_next_prev_list(E0,E1,X0,[X1|Xs]) :- if_(X0=E0, X1=E1, member_next_prev_list(E0,E1,X1,Xs)).

?- find(X,Y,List).
List = [            X,Y|_Z] ;
List = [_A,         X,Y|_Z], dif(_A,X) ;
List = [_A,_B,      X,Y|_Z], dif(_A,X), dif(_B,X) ;
List = [_A,_B,_C,   X,Y|_Z], dif(_A,X), dif(_B,X), dif(_C,X) ;
List = [_A,_B,_C,_D,X,Y|_Z], dif(_A,X), dif(_B,X), dif(_C,X), dif(_D,X) ...

让我们运行OP /其他答案/一些评论提到的查询:

?- find(a,X,[a,a,b]).
X = a.                      % succeeds deterministically
?- find(a,X,[a,Y,b]).
X = Y.                      % succeeds deterministically
?- find(a,b,[a,a,b]).
false.                      % fails

?- find(a,X,[a,a,b,c]).
X = a.                      % succeeds deterministically
?- find(b,X,[a,a,b,c]).
X = c.                      % succeeds deterministically

现在对于 little 更为通用的东西:

?- find(X,Y,[a,a,b,c]).
X = a, Y = a ;
X = b, Y = c ;
false.

最常见的查询怎么样?由于代码,我们得到逻辑上合理的答案:

findB/3

编辑2015-05-06

这是一个更简洁的变体,缺乏想象力的称为find/3

findB(E0,E1,[X0,X1|Xs]) :-
   if_(X0=E0, X1=E1, findB(E0,E1,[X1|Xs])).

findB/3一样,findC/3在不留下无用的选择点的意义上是有效的,但它具有更高的内存使用率。

[X1|Xs]尝试通过提升公共表达式$svg = '<?xml version="1.0" encoding="UTF-8" standalone="no"?> <svg style="overflow: hidden; position: relative;" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="754" version="1.1" height="565"> <defs></defs> <image transform="matrix(1,0,0,1,0,0)" preserveAspectRatio="none" x="0" y="0" width="754" height="565" xlink:href="/path/to/htdocs/wp-content/uploads/2012/10/capapix_Harley_Davidson_FLSTCI_-_Heritage_Classic.jpg"></image> </svg>'; 来减少内存使用量:

findC(E0,E1,[X0|XXs]) :-
   XXs = [X1|_],
   if_(X0=E0, X1=E1, findC(E0,E1,XXs)).

答案 1 :(得分:2)

这是一个没有剪辑的版本:

find(X,Y,[X,Y|_]).
find(X,Y,[Z|Tail]) :- 
    X\=Z, find(X,Y,Tail).

答案 2 :(得分:0)

这是一个纯粹的版本:

find(X,Y, [X,Y|_]).
find(X,Y, [X0,Y0|Xs]) :-
   dif(X+X0,Y+Y0),
   find(X,Y, [Y0|Xs]).

我宁愿拥有一个确定性的版本,而且纯DCG版本也会很酷!