1

我正在尝试从数据库中获取符合我条件的对象列表。

这是我的数据库:

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 没有向我返回如下列表:

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].

为什么会发生这种情况,我该如何解决?

4

1 回答 1

1

您可能需要查找findall/3谓词的规范,第一个参数是Template(或产量):它指定您要放入列表中的内容。

所以你不应该简单地写X一个,而是一个你感兴趣的术语。例如:

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

将在他们的课程列表中生成所有Id学生的 s ;infi/a或者如果你对这些对象感兴趣student/2,你可以写:

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

所以通常你使用你在Goal(第二个参数)中指定的变量,如果你的产量中有一个自由变量,它会产生新的自由变量。

于 2017-11-04T23:32:16.003 回答