0

好的,假设我有这两个事实:

数据1([50, 20, 15, 20, 25, 20, 84])。数据2([50, 30, 15, 5, 10, 18, 60])。

我想做一个查询,询问定义为这些事实的一部分的列表的第 N 个元素是否是某个值。

query([L1|Tail]) :- L1 是 50。这将起作用,但前提是查询是这样的 - query([50, 30, 20]) .. 我想问类似query(data1)的问题。

4

2 回答 2

3

CapelliC 的回答是正确的,他讨论了为什么您应该使用内置的nth/3或无论如何调用它(nth1/3实际上不是 ISO,并且在某些实现中不可用,例如 GNU-Prolog)。我只想添加一些说明:

您在这里的第一个问题是要问一个问题,“列表的第 N 个元素是否具有特定值”,您已经需要两个参数:NValue。此外,is它是评估算术表达式的谓词,不能用于您的目的。

至于query(data1),您需要某种形式的元调用....

总之:

% query(Fact, N, Value) is true
% when the Nth element of the list argument of Fact is Value
query(Fact, N, Value) :-
    call(Fact, List),
    nth(N, List, Value).

它可以这样调用:

?- query(data1, 3, 15).

查询data1具有一个参数的所有事实,一个列表。

这里nth应该定义为:

当 Value 是 List 的第 N 个元素时,nth(N, List, Value) 为真

但你真的应该使用你正在使用的实现中可用的内置。

于 2013-06-14T08:19:29.687 回答
1

您可以使用nth1 /3 按索引访问列表元素。

请注意在文档中它被声明为nth1(?Index, ?List, ?Elem). 参数上的问号表示该参数可能未绑定。换句话说,nth1/3 可以以多种方式工作。

要获取索引处的元素(基于 1):

?- data1(L), nth1(2, L, V).
L = [50, 20, 15, 20, 25, 20, 84],
V = 20.

或搜索元素所在的位置:

?- data1(L), nth1(P, L, 20).
L = [50, 20, 15, 20, 25, 20, 84],
P = 2 ;
L = [50, 20, 15, 20, 25, 20, 84],
P = 4 ;
L = [50, 20, 15, 20, 25, 20, 84],
P = 6 ;
false.

它尽可能普遍地工作,忠实于 Prolog 模型,我们没有函数,但有关系。

nth1/3 它是列表元素和索引之间的关系。

于 2013-06-13T22:16:39.573 回答