2012-06-03 87 views
0

不是按'a'查看终端上的所有结果,而是将它们存储在列表 ([[]])的列表中。我怎样才能使用新创建的功能呢?构成列表清单

我有一个功能;

foo(X, Y). 
    ^^ 
    ^returns a list ex [1,2,3,4] 
    ^
    input 

我做了什么:

bar(A,B) :- foo(X,Y), B is [Y|B], bar(A,B) . 

但上面的代码是不行的。

回答

3
bar(A,B) :- foo(X,Y), B is [Y|B], bar(A,B) . 
         ^ ^^

有3个问题:

  1. 计算算术,=必须使用
  2. 但随后B = [Y|B]将创建一个环状结构,SWI-Prolog的可 处理它,但我dubt这是你的意图
  3. bar(A,B)它的正好等于规则'头部。这不一定是错误,因为实例化的变量实际上可以改变执行流程,但我看不出为什么在这里使用。

的findall/3应解决您的问题:

bar(A,B) :- findall(Y, (X=A, foo(X,Y)), B). 

我给自己定X=A,否则A是没用的。清晰的表达方式是

bar(A,B) :- findall(Y, foo(A,Y), B).