1

そのため、split 内で直接ソート ライブラリ述語を使用して、ラッパー句を取り除こうとしています。split とは、次のようなリストから数値のリストを生成することです: [1:2,3:2,4:6] ---split--> [1,2,3,2,4,6] ]。しかし、生成されたリストには重複が含まれており、それは望ましくないため、ラッパーを使用して分割と並べ替えを組み合わせ、目的の結果 [1,2,3,4,6] を生成しています。

ラッパーを取り除き、分割内で並べ替えを使用したいのですが、「エラー: sort/2: 引数が十分にインスタンス化されていません」というメッセージが表示され続けます。何か案は?ありがとう :)

split([],[]).
split([H1:H2|T],[H1,H2|NT]) :-
    split(T,NT).

wrapper(L,Processed) :- 
    split(L,L2),
    sort(L2,Processed).
4

1 に答える 1

1

ラッパーを取り除き、split内でsortを使用したいのですが

次にfindall、次のような複雑な目標で使用します

split(Edges, NodeSet) :-
    findall(Node,
            (member(Edge, Edges), (Edge = (Node:_); Edge = (_:Node))),
            NodeList),
    sort(NodeList, NodeSet).

ただし、集約述語の使用を開始したら、をスキップして次sortを使用することもできますsetof

split(Edges, NodeSet) :-
    setof(Node, Edge^Pair^(member(Edge, Edges),
                           Edge =.. [:|Pair],
                           member(Node,Pair)),
          NodeSet).

次のように読みます:存在するすべてのNodestEdgeと存在するPairst(など)のセットを取得し、それを呼び出しますNodeSet

=.."univ")演算子は、ペアを分解しますEdge =.. [:, Left, Right]。読みやすくするために、別の述語を記述して、エッジからノードを取得できます。

% endpoint(Edge, Node) is true iff Node is an endpoint of Edge
endpoint(Node:_, Node).
endpoint(_:Node, Node).

split(Edges, NodeSet) :-
    setof(Node, Edge^(member(Edge, Edges), endpoint(Edge, Node)), NodeSet).

編集このアプローチを試す前に、これがOPの元のコードよりも優れているかどうかについて、この回答の下の説明を参照してください。

于 2012-11-15T17:03:41.483 に答える