0

我不想按“a”在终端上查看所有结果,而是将它们存储在列表列表中([[]])。如何使用新创建的函数 bar 来做到这一点?

我有一个功能;

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

但是上面的代码是行不通的。

4

1 回答 1

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

有3个问题:

  1. is计算算术,=必须使用
  2. 但随后B = [Y|B]会创建一个循环结构,SWI-Prolog 可以处理它,但我认为这是你的意图
  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).
于 2012-06-03T13:36:32.647 回答