如何从特定节点打印所有节点
how to print all nodes from a particular node
我有以下知识库:
connects(1,11,10,8).
connects(1,12,2,6).
connects(1,13,-3,-2).
connects(1,14,1,-5).
我有这个谓词:
friends(Node, L):-
findall(X,(connects(Node,X,_,_);connects(X,Node,_,_)),L).
当我提出问题时?- friends(1,L) 我有这个:
L = [11, 12, 13, 14].
但我的目标是打印这样的列表:
L = [11,10,8,12,2,6,13,-3,-2,14,-5]
如何实现?
假设你是可以改变谓词的。用变量替换 _
s 将为您提供所需的值。然后使用 flatten/2
将矩阵(二维列表)转换为简单的一维列表。
这应该可以解决您的问题。
friends(Node, L):-
findall([X, Y, Z], (connects(Node, X, Y, Z)), A),
flatten(A, L).
示例输出:
?- friends(1, L)
L = [11, 10, 8, 12, 2, 6, 13, -3, -2, 14, 1, -5]
我不清楚谓词实际代表什么关系。无论如何,您可以进行以下操作:
- 首先,使用 findall 收集您需要的数据作为 list of lists:
?- findall([X,Y,Z], connects(1,X,Y,Z), L).
L = [[11, 10, 8], [12, 2, 6], [13, -3, -2], [14, 1, -5]].
- 之后,你可以使用append来得到一个展平列表:
?- findall([X,Y,Z], connects(1,X,Y,Z), L0), append(L0, L1).
L0 = [[11, 10, 8], [12, 2, 6], [13, -3, -2], [14, 1, -5]],
L1 = [11, 10, 8, 12, 2, 6, 13, -3, -2, 14, 1, -5].
把它们放在一起,你可以定义friends/2为:
friends(Node, L1):-
findall([X,Y,Z],
( connects(Node, X,Y,Z)
; connects(X, Node, Y,Z) ), L0),
append(L0, L1).
我有以下知识库:
connects(1,11,10,8).
connects(1,12,2,6).
connects(1,13,-3,-2).
connects(1,14,1,-5).
我有这个谓词:
friends(Node, L):-
findall(X,(connects(Node,X,_,_);connects(X,Node,_,_)),L).
当我提出问题时?- friends(1,L) 我有这个:
L = [11, 12, 13, 14].
但我的目标是打印这样的列表:
L = [11,10,8,12,2,6,13,-3,-2,14,-5]
如何实现?
假设你是可以改变谓词的。用变量替换 _
s 将为您提供所需的值。然后使用 flatten/2
将矩阵(二维列表)转换为简单的一维列表。
这应该可以解决您的问题。
friends(Node, L):-
findall([X, Y, Z], (connects(Node, X, Y, Z)), A),
flatten(A, L).
示例输出:
?- friends(1, L)
L = [11, 10, 8, 12, 2, 6, 13, -3, -2, 14, 1, -5]
我不清楚谓词实际代表什么关系。无论如何,您可以进行以下操作:
- 首先,使用 findall 收集您需要的数据作为 list of lists:
?- findall([X,Y,Z], connects(1,X,Y,Z), L).
L = [[11, 10, 8], [12, 2, 6], [13, -3, -2], [14, 1, -5]].
- 之后,你可以使用append来得到一个展平列表:
?- findall([X,Y,Z], connects(1,X,Y,Z), L0), append(L0, L1).
L0 = [[11, 10, 8], [12, 2, 6], [13, -3, -2], [14, 1, -5]],
L1 = [11, 10, 8, 12, 2, 6, 13, -3, -2, 14, 1, -5].
把它们放在一起,你可以定义friends/2为:
friends(Node, L1):-
findall([X,Y,Z],
( connects(Node, X,Y,Z)
; connects(X, Node, Y,Z) ), L0),
append(L0, L1).