Prolog 图形实现(图形是否包括所有顶点?)
尝试实现以下谓词,它接受输入Prolog 图形实现(图形是否包括所有顶点?),prolog,Prolog,尝试实现以下谓词,它接受输入 列表列表-一个列表=一个测试图T(作为边) 图G本身(作为边) 并测试T是否包含G的所有顶点。如果它包含(true),则应返回它。基本上是列表过滤 到目前为止,我得到的是: covb([],G). covb([H|R],G) :- isItCov(G,H), covb(R,G). isItCov([],H). isItCov([V-W|R],H) :- vertex(V,H), vertex(W,H), isItCov(R,H
- 列表列表-一个列表=一个测试图T(作为边)
- 图G本身(作为边)
covb([],G).
covb([H|R],G) :-
isItCov(G,H), covb(R,G).
isItCov([],H).
isItCov([V-W|R],H) :-
vertex(V,H),
vertex(W,H),
isItCov(R,H).
vertex(V,[V-_|G]).
vertex(V,[_-V|G]).
vertex(V,[_|G]):- vertex(V,G).
对于covb([[a-c,c-b,c-d]],[a-b,a-c,a-d,c-d,b-c])
工作正常(true
)。对于covb([[a-c]],[a-b,a-c,a-d,c-d,b-c])也可以正常工作(false
)。我在调用多个列表时遇到了一个问题,比如covb([[a-c,c-b,c-d],[a-c]],[a-b,a-c,a-d,c-d,b-c])。
应该只对第一个列表有效。
我实际上有两个问题-
true
(这是过滤部分)的列表列表项。我该怎么做首先,您的程序有许多单例变量警告不要忽略单例变量警告。它们可以隐藏真正的错误。此外,由于这里更有经验的Prolog用户知道,带有单例变量警告的程序甚至不值得运行,他们将(a)看到警告并决定不再有兴趣尝试帮助您,或(b)修复他们这边的警告,但根据定义,他们将在一个不再是您发布的程序的程序上工作 现在回答你的问题 为什么它只适用于一个列表 现在还不清楚你在问什么,或者上面的“
covb([[a-c,c-b,c-d],[a-c]],[a-b,a-c,a-d,c-d,b-c])。
应该只对第一个有效。”
此查询不会失败:
这归结为测试两个列表中的每一个:
?- isItCov([a-b,a-c,a-d,c-d,b-c], [a-c,c-b,c-d]).
true .
?- isItCov([a-b,a-c,a-d,c-d,b-c], [a-c]).
false.
第一个列表确实涵盖了图表,而第二个列表没有。总的来说,如果所有列表都覆盖了图形,那么您对covb/2
的定义就编写成功了。情况并非如此,因此您的covb/2
查询失败
这是你想知道的吗
我想返回通过条件并返回true(这是过滤部分)的列表的列表项。我该怎么做
您可以查看Prolog的文档中是否有“filter”这个词。在SWI Prolog上,您可以执行以下操作:
?- apropos(filter).
true.
这将指向include/3
谓词,它似乎可以实现您想要的功能:
?- include(isItCov([a-b,a-c,a-d,c-d,b-c]), [[a-c,c-b,c-d],[a-c]], Covers).
Covers = [[a-c, c-b, c-d]].
如果您想为您的具体应用程序编写一个过滤器谓词,它可能如下所示:
graph_covers(_Graph, [], []).
graph_covers(Graph, [Nodes|NodesRest], Covers) :-
( isItCov(Graph, Nodes)
-> Covers = [Nodes|CoversRest]
; Covers = CoversRest ),
graph_covers(Graph, NodesRest, CoversRest).
这与谓词类似,它只是添加了一个额外的参数来收集那些isItCov/2
成功的节点列表。如果未成功,将继续使用不包含当前节点列表的列表
?- graph_covers([a-b,a-c,a-d,c-d,b-c], [[a-c,c-b,c-d],[a-c]], Covers).
Covers = [[a-c, c-b, c-d]] ;
false.
?- graph_covers([a-b,a-c,a-d,c-d,b-c], [[a-c,c-b,c-d],[a-c]], Covers).
Covers = [[a-c, c-b, c-d]] ;
false.