findall(X,condition,List) 列表中充满了指针而不是真正的对象
findall(X,condition,List) list is filled with pointers and not real objects
我正在尝试从数据库中获取符合我条件的完整对象列表。
这是我的数据库:
student(1234,[statistics/a,algorithms/b,prolog/a,infi/b]).
student(4321,[java/a,algorithms/a,prolog/b,probability/b,infi/a]).
student(1111,[algorithms/a,prolog/a,c/a,infi/a]).
student(2222,[c/b,algorithms/b,prolog/b,infi/a]).
student(3333,[java/b,algorithms/b,prolog/a,infi/a]).
student(4444,[java/a,c/a,prolog/a]).
student(5555,[java/a,c/a,prolog/b,infi/b]).
student(6666,[java/a,c/a,prolog/b,infi/b,probability/b,algorithms/b]).
我写了一个谓词来查询哪个学生在他的列表中有一个字符串:"infi/a"
findall(Ns,(student(Id,List),subset([infi/a],List)),L1)
问题是 L1 没有 return 我的列表如下:
L1 = [student(2222,[c/b,algorithms/b,prolog/b,infi/a]),
student(1111,[algorithms/a,prolog/a,c/a,infi/a]) etc...]
它returns:
L1 = [_G2044, _G2041, _G2038, _G2035].
为什么会发生这种情况,我该如何解决?
您可能需要查找 findall/3
谓词的规范 第一个参数是 Template
(或 yield):它指定了您想入榜
所以你不应该简单地写X
,而是你感兴趣的术语。例如:
findall(<b>Id</b>,(student(Id,List),subset([infi/a],List)),L1).
将生成课程列表中包含 infi/a
的学生的所有 Id
;或者如果你对 student/2
对象感兴趣,你可以写:
findall(<b>student(Id,List)</b>,(student(Id,List),subset([infi/a],List)),L1).
所以通常你使用你在 Goal
(第二个参数)中指定的变量,如果你的 yield 中有一个自由变量,它会产生新的自由变量。
我正在尝试从数据库中获取符合我条件的完整对象列表。
这是我的数据库:
student(1234,[statistics/a,algorithms/b,prolog/a,infi/b]). student(4321,[java/a,algorithms/a,prolog/b,probability/b,infi/a]). student(1111,[algorithms/a,prolog/a,c/a,infi/a]). student(2222,[c/b,algorithms/b,prolog/b,infi/a]). student(3333,[java/b,algorithms/b,prolog/a,infi/a]). student(4444,[java/a,c/a,prolog/a]). student(5555,[java/a,c/a,prolog/b,infi/b]). student(6666,[java/a,c/a,prolog/b,infi/b,probability/b,algorithms/b]).
我写了一个谓词来查询哪个学生在他的列表中有一个字符串:"infi/a"
findall(Ns,(student(Id,List),subset([infi/a],List)),L1)
问题是 L1 没有 return 我的列表如下:
L1 = [student(2222,[c/b,algorithms/b,prolog/b,infi/a]), student(1111,[algorithms/a,prolog/a,c/a,infi/a]) etc...]
它returns:
L1 = [_G2044, _G2041, _G2038, _G2035].
为什么会发生这种情况,我该如何解决?
您可能需要查找 findall/3
谓词的规范 第一个参数是 Template
(或 yield):它指定了您想入榜
所以你不应该简单地写X
,而是你感兴趣的术语。例如:
findall(<b>Id</b>,(student(Id,List),subset([infi/a],List)),L1).
将生成课程列表中包含 infi/a
的学生的所有 Id
;或者如果你对 student/2
对象感兴趣,你可以写:
findall(<b>student(Id,List)</b>,(student(Id,List),subset([infi/a],List)),L1).
所以通常你使用你在 Goal
(第二个参数)中指定的变量,如果你的 yield 中有一个自由变量,它会产生新的自由变量。