我希望将它们存储在列表列表中,而不是按'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) .
但上面的代码不起作用。
答案 0 :(得分:3)
bar(A,B) :- foo(X,Y), B is [Y|B], bar(A,B) .
^ ^ ^
有3个问题:
B = [Y|B]
会创建一个循环结构,SWI-Prolog可以
处理它,但我认为这是你的意图bar(A,B)
完全等于规则'head。这不一定是错误,因为实例化变量实际上可以改变执行流程,但我不明白为什么你在这里使用。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).