Prolog查询问题

Prolog查询问题,prolog,declarative,Prolog,Declarative,好吧,假设我有两个事实: data1([50,20,15,20,25,20,84])。 数据2([50,30,15,5,10,18,60])。 我想做一个查询,询问列表中定义为这些事实一部分的第N个元素是否是某个值 查询([L1 | Tail]):-L1是50。这将起作用,但仅当查询是这样的-查询([50,30,20])。。我想问一些问题,比如查询(data1)您可以使用/3按索引访问列表元素 请注意,在文档中声明为nth1(?Index,?List,?Elem)。参数上的问号表示该参数可以解除

好吧,假设我有两个事实:

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

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

查询([L1 | Tail]):-L1是50。这将起作用,但仅当查询是这样的-查询([50,30,20])。。我想问一些问题,比如查询(data1)

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

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

要获取索引处的元素(基于1),请执行以下操作:

或搜索元素所在的位置:

?- 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模型,在Prolog模型中,我们没有函数,只有关系

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

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

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

要获取索引处的元素(基于1),请执行以下操作:

或搜索元素所在的位置:

?- 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模型,在Prolog模型中,我们没有函数,只有关系


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

Capelical的答案是正确的,他讨论了为什么应该使用内置的
nth/3
或它的名称(
nth1/3
实际上不是ISO,在某些实现中不可用,如GNU Prolog)。我只想补充一些澄清:

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

至于
查询(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
事实,请创建一个列表

此处,第n个应定义为:

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


但是您确实应该使用您正在使用的实现中可用的内置组件。

Capelical的答案是正确的,他讨论了为什么您应该使用内置组件
nth/3
,或者它的名称(
nth1/3
实际上不是ISO,并且在某些实现中不可用,比如GNU Prolog)。我只想补充一些澄清:

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

至于
查询(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
事实,请创建一个列表

此处,第n个应定义为:

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

但实际上,您应该使用您正在使用的实现中的内置功能