prolog - 如何在prolog中调用列表的列表

标签 prolog

如何在 Prolog 中调用列表的列表,例如我有这个列表:

list([[1,2,3],[4,5],[6,7]]).

我想在 element_at 函数中调用我的列表:

element_at(X,[X|_],1).
element_at(X,[_|L],K) :-
   element_at(X,L,K1),
   K is K1 + 1.

当我打电话时

element_at(X,list,2)

我没有结果。

最佳答案

I don't have a result.

好吧,你确实有一个结果:失败。但你期望成功。下面是一个非常通用的方法,您可以自己在 Prolog 中定位此类错误:

If you encounter unexpected failure, simply generalize your program.

在您的特定情况下,element_at(X,list,2) 失败。也许应该用 3 代替 2?或者也许是另一个号码? Prolog 中有一种简单的猜测方法:只需用变量替换 3 即可!出于同样的原因,您可以删除定义中的目标。我将使用 * 来标记它们。

这是对您的程序的概括,但仍然失败 - 因此其余部分一定有错误:

:- op(950, fy, *).
*(_).

?- element_at(X, list, _/*2*/).

element_at(X,[_/*X*/|_],_/*1*/).
element_at(X,[_|L],K) :-
   * element_at(X,L,K1),
   * K is K1 + 1.

关于prolog - 如何在prolog中调用列表的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47741440/

相关文章:

prolog - 在列表中查找唯一项

prolog - 在序言中排除 tuples_in 列表

json - 如何在 Prolog 中读取 JSON 文件

json - Prolog接收Json post

logic - 序言,复制列表

Prolog:获取谓词解决方案并将其断言为事实

prolog - 生成元素 (a, b) 的所有可能配对,其中 a 来自集合 A,b 来自 prolog 中的集合 B

debugging - 当你跟踪时,Prolog 中的重做是什么?

prolog - 路由进入无限循环序言

dynamic - 谓词 `contracting/1` 是否恢复已删除的不一致值?