2013-04-13 151 views
0

我在练习中遇到了一些麻烦,要求我在Prolog中实现经典的arg谓词。如何在Prolog中实现arg谓词?

arg(?Arg, +Term, ?Value) 

其中,Arg它是Term的参数列表中参数的索引。值是这个参数的价值。

例如:

arg(1, t(f(X),Y,a), Value) 
Value = f(X). 

由于F(X)是在T主函子的参数列表中的第一个参数。

所以我tryng使用大学解决运动= ..谓词是这样的:

myArg(ArgIndex, Term, ArgValue) :- integer(ArgIndex), 
            Term =.. [_|ArgsList], 
         countArg(ArgsList, ArgIndex, ArgValue). 

我的想法是:ArgIndex必须是整数,我可以分解我的任期到其主要仿函数和aguments列表ArgsList,现在我都数不过来的参数(在此列表中),直到ArgIndex是0

,但我不能指望,并借此值...

回答

2

您需要的可能是nth(有关语义,请参阅here)。为了实现它,如果你不想使用内置的一些原因:

nth(1, [H|_], H). 
nth(N, [_|Tail], Nth) :- N > 1, N1 is N-1, nth(N1, Tail, Nth). 

(第一个参数必须是一个实例化的整数)

如果你真的不知道该怎么自己实施这个谓词,你可能想看看“艺术的Prolog”,斯特林和夏皮罗。他们展示了许多SWI-Prolog内置插件的许多示例和参考实现。

+0

Tnx的建议,我也将这本书...现在我正在研究伊万布拉特科“编程为人工智能”,这是很好,但一些例子不存在 – AndreaNobili