Prolog,访问列表的特定成员?

时间:2012-10-17 16:55:39

标签: list prolog unification

有谁能告诉我如何访问prolog中列表的特定成员?比方说,我需要访问传递给规则的列表的第3或第4个元素吗?

4 个答案:

答案 0 :(得分:26)

带有SWI-Prolog的

nth0(Ind, Lst, Elem)nth1(Ind, Lst, Elem)nth0第一个元素的索引为0。

例如,

nth0(3, [a, b, c, d, e], Elem). %Binds d to Elem
nth1(3, [a, b, c, d, e], Elem). %Binds c to Elem

nth0(Ind, [a, b, c, d, e], d).  %Binds 3 to Ind
nth0(3, [a, b, c, X, e], d).    %Binds d to X

nth0(3, [a, b, c, d, e], c).    %Fails.

答案 1 :(得分:7)

当您需要访问的索引太小时,您可以使用模式匹配。假设我们需要第三个元素或第四个元素:

third([_,_,E|_], E).
fourth([_,_,_,E|_], E).

如果使用“内联”,当列表包含位置相关性的信息时,这可能会更有用。例如

your_rule([_,_,E|Rest], Accum, Result) :-
   Sum is Accum + E,
   your_rule(Rest, Sum, Result).
...

答案 2 :(得分:2)

prolog列表是一个经典列表。访问不是直接的。你必须迭代才能找到你需要的东西。

你可以这样得到第n个元素:

foo( [X1,X2,X3,X4,...,XN|Xs] ) :- ...

其中[code] X [/ code] n 是列表的 nth 元素。 n 大于小值时不切实际。这大致类似于C / C ++指针表达式:

LLNode *nthElement = root->next->...->next ;

否则,您必须遍历列表以使用内置谓词或home-brew谓词来查找所需元素,例如:

foo(Xs): - nth_element(Xs,9,X),...

nth_element(Xs,N,X): - nth_element(Xs,0,N,X)。

nth_element([X | Xs],N,N,X): - !.    nth_element([_ | Xs],T,N,X): - T1是T + 1,nth_element(Xs,T1,N,X)。

答案 3 :(得分:0)

使用SWI-Prolog的func库,可以更简洁地编写列表推导:

domain_details:: where('domain_ex_date','<',date('Y-m-d',strtotime("+7 days")))         
              -> where('domain_ex_date','>',date('Y-m-d'))
              ->get();

现在,您可以访问列表中的两个元素并将它们一起添加:

:- use_module(library(func)).

nth0((Index, List), Result) :-
    nth0(Index,List,Result).