2017-03-09 3 views
1

として、私は次のコードを持っているPrologのクエリ結果を取得します:私は、次の取得結果のグラフを取得するクエリを実行したらグラフ表現

edge(a,e). 
edge(e,d). 
edge(d,c). 
edge(c,b). 
edge(b,a). 
edge(d,a). 
edge(e,c). 
edge(f,b). 
graph(Graph):-findall(A-B, edge(A,B), L), 
    findall(B-A, edge(A,B), L1), 
    append(L, L1, Graph). 

?-rbacGraph(Graph);true. 
Graph=[a-e,b-a,c-b,d-a,d-c,e-c,e-d,f-b,a-b,a-d,b-c,b-f,c-d,c-e,d-e,e-a]. 

を私はしたいですこれを尋ねると、結果をPrologからグラフィック表現に変換する(ノードとコネクションのエッジを取得する)方法はありますか?

+2

ははWouterビークの[ 'plGraphViz'](https://github.com/wouterbeek/plGraphViz)はオプションパッケージであるスニペット? –

+0

はい。あなたはパッケージの簡単な説明をすることができますか? – StamDad

+3

@ StambouliA.ouadoud:与えられたリンクをたどってください! – false

答えて

1

次のHTML5スニペット(礼儀cytoscape.js)この 'プログラム' によって生成される出力に貼り付けるために考えることができます。

graph_so :- 
    setof(N, M^(edge(N,M);edge(M,N)), Ns), 
    maplist([N] >> format('{data:{id:"~w"}},~n', [N]), Ns), 
    forall(edge(S,T), format('{data:{id:"~w-~w",source:"~w",target:"~w"}},~n', [S,T,S,T])). 

edge(a,e). 
edge(e,d). 
edge(d,c). 
edge(c,b). 
edge(b,a). 
edge(d,a). 
edge(e,c). 
edge(f,b). 

<!DOCTYPE html> 
 
<html> 
 
<head> 
 
    <meta charset="utf-8"> 
 
    <script src="https://cdnjs.cloudflare.com/ajax/libs/cytoscape/2.7.16/cytoscape.min.js"></script> 
 
</head> 
 
<div id='cy'></div> 
 
<style> 
 
#cy { 
 
    width: 500px; 
 
    height: 500px; 
 
} 
 
</style> 
 
<script> 
 
(function() { 
 
    
 
    var elements = [ 
 
     // generated by Prolog 
 
     {data:{id:"a"}}, 
 
     {data:{id:"b"}}, 
 
     {data:{id:"c"}}, 
 
     {data:{id:"d"}}, 
 
     {data:{id:"e"}}, 
 
     {data:{id:"f"}}, 
 
     {data:{id:"a-e",source:"a",target:"e"}}, 
 
     {data:{id:"e-d",source:"e",target:"d"}}, 
 
     {data:{id:"d-c",source:"d",target:"c"}}, 
 
     {data:{id:"c-b",source:"c",target:"b"}}, 
 
     {data:{id:"b-a",source:"b",target:"a"}}, 
 
     {data:{id:"d-a",source:"d",target:"a"}}, 
 
     {data:{id:"e-c",source:"e",target:"c"}}, 
 
     {data:{id:"f-b",source:"f",target:"b"}},     
 
    ]; 
 
    
 
    var cy = cytoscape({ 
 
     container: document.getElementById('cy'), 
 
     elements: elements, 
 
     style: [ 
 
      { selector: 'node', 
 
       style: { 
 
        'background-color': '#666', 
 
        'label': 'data(id)' 
 
       } 
 
      }, 
 
      { selector: 'edge', 
 
       style: { 
 
        'target-arrow-shape': 'triangle', 
 
        'width': 3, 
 
        'line-color': '#ddd', 
 
        'target-arrow-color': '#ddd', 
 
        'curve-style': 'bezier' 
 
       } 
 
      } 
 
     ], 
 
    }) 
 

 
    var layout = cy.makeLayout({ name: 'cose' }); 
 
    layout.run(); 
 
})() 
 
</script> 
 
</html>

またはこれより効率的なスキーマ(からPrologの視点)、オリジナルのコードから得た有向グラフを生成します:

graph_opt :- 
    setof(N, node_(N), Ns), 
    maplist([N] >> format('{data:{id:"~w"}},~n', [N]), Ns). 
node_(S) :- 
    (edge(S,T) ; edge(T,S)), 
    format('{data:{id:"~w-~w",source:"~w",target:"~w"}},~n', [S,T,S,T]). 

編集

は、HTMLからjQueryの依存関係を削除

+0

.....ありがとうございました....私はそれを試み、あなたに戻ってきます。 – StamDad

関連する問題