Prolog findall(X,条件,列表)列表中充满了指针,而不是真实的对象

Prolog findall(X,条件,列表)列表中充满了指针,而不是真实的对象,prolog,prolog-findall,Prolog,Prolog Findall,我正试图从数据库中获取一个符合我条件的对象列表 这是我的数据库: 我编写了一个谓词,查询列表中哪个学生的字符串是“infi/a” 问题是L1没有返回如下列表: 它返回: L1 = [_G2044, _G2041, _G2038, _G2035]. 为什么会发生这种情况?我如何解决这个问题?您可能需要查找谓词的规范第一个参数是模板(或yield):它指定要放入列表中的内容 因此,您不应该简单地编写X,而应该编写一个您感兴趣的术语。例如: findall(Id,(student(Id,List),

我正试图从数据库中获取一个符合我条件的对象列表

这是我的数据库:

我编写了一个谓词,查询列表中哪个学生的字符串是“infi/a”

问题是L1没有返回如下列表:

它返回:

L1 = [_G2044, _G2041, _G2038, _G2035].

为什么会发生这种情况?我如何解决这个问题?

您可能需要查找谓词的规范第一个参数是
模板
(或yield):它指定要放入列表中的内容

因此,您不应该简单地编写
X
,而应该编写一个您感兴趣的术语。例如:

findall(Id,(student(Id,List),subset([infi/a],List)),L1).

因此,通常您使用在
目标中指定的变量(第二个参数),如果收益率中存在自由变量,它将生成新的自由变量。

谢谢!这就成功了。出于某种原因,我很难掌握“第一个参数是模板”,但现在在你的回答之后,我明白了这个概念!这些不是“指针”。这些是未实例化的匿名变量。这是因为您的
Ns
没有出现在
findall/3
条件(第二个参数)的任何地方,因此
findall/3
用空变量填充
L1
L1 = [student(2222,[c/b,algorithms/b,prolog/b,infi/a]),
      student(1111,[algorithms/a,prolog/a,c/a,infi/a]) etc...]
L1 = [_G2044, _G2041, _G2038, _G2035].
findall(Id,(student(Id,List),subset([infi/a],List)),L1).
findall(student(Id,List),(student(Id,List),subset([infi/a],List)),L1).