0

我在要求我在 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 分解为其主函子和参数列表ArgsList,现在我必须计算参数(在此列表中),直到 ArgIndex 为 0

但我无法计算并接受这个值......

4

1 回答 1

2

您需要的可能是nth(有关语义,请参见此处)。要实现它,如果您出于某种原因不想使用内置:

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

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

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

于 2013-04-13T19:33:21.550 回答