如何在Prolog中实现arg谓词?

时间:2013-04-13 17:44:07

标签: prolog

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

arg(?Arg, +Term, ?Value)

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

例如:

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

因为f(x)它是t主仿函数的参数列表中的第一个参数。

所以我尝试以这种方式使用univ = .. 谓词来解决练习:

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

我的想法是:ArgIndex必须是一个整数,我可以将我的Term分解为它的主要仿函数和aguments列表 ArgsList ,现在我必须计算参数(在此列表中)直到ArgIndex是0

但我无法计算并取这个值......

1 个答案:

答案 0 :(得分:2)

您需要的可能是nth(请参阅here了解语义)。要实现它,以防您出于某种原因不想使用内置函数:

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

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

如果你真的不知道如何自己实现这个谓词,你可能想看看“Prolog的艺术”,Sterling和Shapiro。它们展示了许多SWI-Prolog内置函数的示例和参考实现。