我在练习中遇到一些麻烦,要求我在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
但我无法计算并取这个值......
答案 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内置函数的示例和参考实现。