好的,假设我有这两个事实:
数据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)的问题。
好的,假设我有这两个事实:
数据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)的问题。
CapelliC 的回答是正确的,他讨论了为什么您应该使用内置的nth/3
或无论如何调用它(nth1/3
实际上不是 ISO,并且在某些实现中不可用,例如 GNU-Prolog)。我只想添加一些说明:
您在这里的第一个问题是要问一个问题,“列表的第 N 个元素是否具有特定值”,您已经需要两个参数:N和Value。此外,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) 为真
但你真的应该使用你正在使用的实现中可用的内置。
您可以使用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 它是列表元素和索引之间的关系。