【问题标题】:How to implement arg predicate in Prolog?如何在 Prolog 中实现 arg 谓词?
【发布时间】:2013-04-06 03:12:27
【问题描述】:

我在一个要求我在 Prolog 中实现经典 arg 谓词的练习中遇到了一些问题。

arg(?Arg, +Term, ?Value)

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

例如:

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

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

【问题讨论】:

    标签: prolog


    【解决方案1】:

    您需要的可能是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 内置插件的示例和参考实现。

    【讨论】:

    • Tnx 的建议,我也会拿这本书...现在我正在研究 Ivan Bratko “人工智能编程”,它非常好,但没有一些例子
    猜你喜欢
    • 1970-01-01
    • 2014-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多