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本身(作为边)
并测试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).

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.