我不想按“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) .
但是上面的代码是行不通的。
我不想按“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) .
但是上面的代码是行不通的。
bar(A,B) :- foo(X,Y), B is [Y|B], bar(A,B) .
^ ^ ^
有3个问题:
B = [Y|B]
会创建一个循环结构,SWI-Prolog 可以处理它,但我认为这是你的意图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).