题
使用SWI Prolog的,还有的是发现在一个名为NTH1列表中的第n项的谓语。我想实现我自己的谓词的版本,但如果你看看上市(NTH1)代码SWI的是如此的复杂。是否有这样做的一个简单的方法?
感谢您:)
。解决方案
在SWI代码是有点复杂,因为谓词可用于从可变索引生成:
?- nth1(Idx,[a,b,c],X).
Idx = 1,
X = a ;
Idx = 2,
X = b ;
Idx = 3,
X = c ;
false.
如果你不希望这样的行为,nth1/3
可以很容易地在nth0
方面实现的:
nth1(Idx,List,X) :-
Idx0 is Idx-1,
nth0(Idx0,List,X).
修改:这也有可能不nth0
做的代码短短的几行:
nth1(1,[X|_],X) :- !.
nth1(Idx,[_|List],X) :-
Idx > 1,
Idx1 is Idx-1,
nth1(Idx1,List,X).
其他提示
考虑采用有限域约束为一般(可逆)的整数运算
:- use_module(library(clpfd)).
nth1(1, [E|_], E).
nth1(N, [_|Xs], E) :-
N #> 1,
N #= N1 + 1,
nth1(N1, Xs, E).
我不是故意的矛盾或让别人做我的工作实际;我只是想一些建议,遗憾的是不清晰的。
我现在已经实现了它自己,但可能你们可能提出改进建议或者做的更好的办法?我经常发现自己在序言做的是写有发言权的谓词计数器的计数或组并获得较少的参数谓词来调用条款与额外的参数。这往往最终产生相当多的代码。无论如何,这是我实现我只是做了:
item_at( N, L, Item ) :-
item_at( N, 0, L, Item ).
item_at( N, Count, [H|_], Item ) :-
CountNew is Count + 1,
CountNew = N,
Item = H.
item_at( N, Count, [_|T], Item ) :-
CountNew is Count + 1,
item_at( N, CountNew, T, Item ).
任何意见?谢谢 :)。用法:
?- item_at(3,[a,b,c,d,e],Item).
Item = c ;
不隶属于 StackOverflow