撰写清单列表

时间:2012-06-03 10:55:32

标签: prolog

我希望将它们存储在列表列表中,而不是按'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) .

但上面的代码不起作用。

1 个答案:

答案 0 :(得分:3)

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

有3个问题:

  1. 评估算术,必须使用 =
  2. 但是B = [Y|B]会创建一个循环结构,SWI-Prolog可以 处理它,但我认为这是你的意图
  3. bar(A,B) 完全等于规则'head。这不一定是错误,因为实例化变量实际上可以改变执行流程,但我不明白为什么你在这里使用。
  4. 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).