有谁能告诉我如何访问prolog中列表的特定成员?比方说,我需要访问传递给规则的列表的第3或第4个元素吗?
答案 0 :(得分:26)
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).