2016-05-19 1 views
0

AB要素([ab、bc、cd])で構成されるリストがあれば、 (私が返す)リストであり、そうでない場合は、まだ出力リストにない "A"または "B"要素を追加します。要素がリストに含まれていないかどうかを確認する方法、挿入しない場合は

まだわかりません(私が見たことのないマッピングやものを使って見つけたような)。

ので、出力リストは、唯一持っている[A、B、C、D]

編集する必要があります:私がやろうとしているが、私はこのように呼ばれます、次のとおりです。

enumerate([a-b,b-c,c-d], EnumNodes, EnumArcs) 

そして私は2つのリストを返さなければならない。

2つ目は言ったノード間でのアーク(conections)を与える、

[enum(1,a),enum(2,b),enum(3,c),enum(4,d)]

をだから私は、私が「知っている」の部分で午前:最初のものは、この特定のフォームで(ノードを提供します。どのように数えると、リスト内の項目を返しますが、私は以下の知らないために:「A」がリストにある場合

は - どのように最初のチェックにリスト

- どのようにONLYユニークな要素を挿入するために、それを挿入しない場合は、 "B"が入っているかどうか確認してくださいリストを挿入していない場合は、それを挿入します(これを知らない私の理由は、ルールを呼び出す方法は一度やり直すことができません。一度二回、各要素ごとに1回、再帰の各ステップ、間違いなしに)

+1

はあなたが達成しようとしているものの例のクエリを表示する必要があります。それ自身の説明は不明です。あなたは、あなたが見つけることができる最も近い答えへのリンクを表示し、おそらく特定の質問を提示するかもしれません。 「マッピングやもの」は実際にそれをカバーしていません。 – lurker

+0

本当にうまくやってくれて申し訳ありません(それは私の3番目の編集だった、私はいつもあまりにも短くない、または長すぎる/特定したくない)。 – keont

+1

'memberchk/2'を使って、要素がリストにあるかどうかを判断できます。 – lurker

答えて

1

このような節をお探しですか?

% ensure(ELEMENT, LIST_IN, LIST_OUT) 

% If X is already a member of L, then the result is L 
ensure(X, L, L) :- 
    member(X, L), !. 

% If not, the result is X appended to L 
ensure(X, L, [X | L]). 

用途:

1 ?- ensure(1, [1,2,3], O). 
O = [1, 2, 3]. 

2 ?- ensure(2, [1,3], O). 
O = [2, 1, 3]. 

を私はこれはあなたが探しているものの一種だと思う...

% enumerate(CONNECTIONS_IN, NODES_OUT, ARCS_OUT) 

enumerate(C, N, A) :- 
    enum_nodes(C, [], N, 1), 
    create_arcs(C, N, A). 

% enum_nodes(CONNECTIONS_IN, NODES_IN, NODES_OUT, START_ID) 
% Fills up NODES_OUT with enums. New IDs start at START_ID... 

enum_nodes([], N, N, _). 
enum_nodes([A-B | T], N, NOUT, ID) :- 
    ensure_node(A, N, NTMP1, ID, ID1), 
    ensure_node(B, NTMP1, NTMP2, ID1, ID2), 
    enum_nodes(T, NTMP2, NOUT, ID2). 

% ensure_node(NODE, NODES_IN, NODES_OUT, ID_IN, ID_OUT) 
% Adds enum(ID_IN, NODE) to NODES_IN to produce NODES_OUT if NODE does not already exist in NODES_IN 

ensure_node(NODE, NODES_IN, NODES_IN, ID, ID) :- 
    member(enum(_, NODE), NODES_IN), !. 

ensure_node(NODE, NODES_IN, [enum(ID_IN, NODE) | NODES_IN], ID_IN, ID_OUT) :- 
    ID_OUT is ID_IN + 1. 

% create_arcs(CONNECTIONS_IN, NODES_IN, ARCS_OUT). 
% Create arcs - makes a list of arc(NODE_ID_1, NODE_ID_2)... 

create_arcs([], _, []). 
create_arcs([A-B | T], NODES, [arc(NODE_ID_A, NODE_ID_B) | TARCS]) :- 
    member(enum(NODE_ID_A, A), NODES), 
    member(enum(NODE_ID_B, B), NODES), 
    create_arcs(T, NODES, TARCS). 

出力例:

1 ?- enumerate([a-b, c-d, d-a], N, A). 
N = [enum(4, d), enum(3, c), enum(2, b), enum(1, a)], 
A = [arc(1, 2), arc(3, 4), arc(4, 1)] . 
012あなたがtraceを行う場合、あなたはそれが働いて見ることができます

...

2 ?- trace. 
true. 

[trace] 2 ?- enumerate([a-b, c-d, d-a], N, A). 
    Call: (6) enumerate([a-b, c-d, d-a], _G2634, _G2635) ? creep 
    Call: (7) enum_nodes([a-b, c-d, d-a], [], _G2634, 1) ? creep 
    Call: (8) ensure_node(a, [], _G2740, 1, _G2742) ? creep 
    Call: (9) lists:member(enum(_G2731, a), []) ? creep 
    Fail: (9) lists:member(enum(_G2731, a), []) ? creep 
    Redo: (8) ensure_node(a, [], _G2740, 1, _G2742) ? creep 
    Call: (9) _G2747 is 1+1 ? creep 
    Exit: (9) 2 is 1+1 ? creep 
    Exit: (8) ensure_node(a, [], [enum(1, a)], 1, 2) ? creep 
    Call: (8) ensure_node(b, [enum(1, a)], _G2749, 2, _G2751) ? creep 
    Call: (9) lists:member(enum(_G2740, b), [enum(1, a)]) ? creep 
    Fail: (9) lists:member(enum(_G2740, b), [enum(1, a)]) ? creep 
    Redo: (8) ensure_node(b, [enum(1, a)], _G2749, 2, _G2751) ? creep 
    Call: (9) _G2756 is 2+1 ? creep 
    Exit: (9) 3 is 2+1 ? creep 
    Exit: (8) ensure_node(b, [enum(1, a)], [enum(2, b), enum(1, a)], 2, 3) ? creep 
    Call: (8) enum_nodes([c-d, d-a], [enum(2, b), enum(1, a)], _G2634, 3) ? creep 
    Call: (9) ensure_node(c, [enum(2, b), enum(1, a)], _G2758, 3, _G2760) ? creep 
    Call: (10) lists:member(enum(_G2749, c), [enum(2, b), enum(1, a)]) ? creep 
    Fail: (10) lists:member(enum(_G2749, c), [enum(2, b), enum(1, a)]) ? creep 
    Redo: (9) ensure_node(c, [enum(2, b), enum(1, a)], _G2758, 3, _G2760) ? creep 
    Call: (10) _G2765 is 3+1 ? creep 
    Exit: (10) 4 is 3+1 ? creep 
    Exit: (9) ensure_node(c, [enum(2, b), enum(1, a)], [enum(3, c), enum(2, b), enum(1, a)], 3, 4) ? creep 
    Call: (9) ensure_node(d, [enum(3, c), enum(2, b), enum(1, a)], _G2767, 4, _G2769) ? creep 
    Call: (10) lists:member(enum(_G2758, d), [enum(3, c), enum(2, b), enum(1, a)]) ? creep 
    Fail: (10) lists:member(enum(_G2758, d), [enum(3, c), enum(2, b), enum(1, a)]) ? creep 
    Redo: (9) ensure_node(d, [enum(3, c), enum(2, b), enum(1, a)], _G2767, 4, _G2769) ? creep 
    Call: (10) _G2774 is 4+1 ? creep 
    Exit: (10) 5 is 4+1 ? creep 
    Exit: (9) ensure_node(d, [enum(3, c), enum(2, b), enum(1, a)], [enum(4, d), enum(3, c), enum(2, b), enum(1, a)], 4, 5) ? creep 
    Call: (9) enum_nodes([d-a], [enum(4, d), enum(3, c), enum(2, b), enum(1, a)], _G2634, 5) ? creep 
    Call: (10) ensure_node(d, [enum(4, d), enum(3, c), enum(2, b), enum(1, a)], _G2776, 5, _G2778) ? creep 
    Call: (11) lists:member(enum(_G2767, d), [enum(4, d), enum(3, c), enum(2, b), enum(1, a)]) ? creep 
    Exit: (11) lists:member(enum(4, d), [enum(4, d), enum(3, c), enum(2, b), enum(1, a)]) ? creep 
    Exit: (10) ensure_node(d, [enum(4, d), enum(3, c), enum(2, b), enum(1, a)], [enum(4, d), enum(3, c), enum(2, b), enum(1, a)], 5, 5) ? creep 
    Call: (10) ensure_node(a, [enum(4, d), enum(3, c), enum(2, b), enum(1, a)], _G2779, 5, _G2781) ? creep 
    Call: (11) lists:member(enum(_G2770, a), [enum(4, d), enum(3, c), enum(2, b), enum(1, a)]) ? creep 
    Exit: (11) lists:member(enum(1, a), [enum(4, d), enum(3, c), enum(2, b), enum(1, a)]) ? creep 
    Exit: (10) ensure_node(a, [enum(4, d), enum(3, c), enum(2, b), enum(1, a)], [enum(4, d), enum(3, c), enum(2, b), enum(1, a)], 5, 5) ? creep 
    Call: (10) enum_nodes([], [enum(4, d), enum(3, c), enum(2, b), enum(1, a)], _G2634, 5) ? creep 
    Exit: (10) enum_nodes([], [enum(4, d), enum(3, c), enum(2, b), enum(1, a)], [enum(4, d), enum(3, c), enum(2, b), enum(1, a)], 5) ? creep 
    Exit: (9) enum_nodes([d-a], [enum(4, d), enum(3, c), enum(2, b), enum(1, a)], [enum(4, d), enum(3, c), enum(2, b), enum(1, a)], 5) ? creep 
    Exit: (8) enum_nodes([c-d, d-a], [enum(2, b), enum(1, a)], [enum(4, d), enum(3, c), enum(2, b), enum(1, a)], 3) ? creep 
    Exit: (7) enum_nodes([a-b, c-d, d-a], [], [enum(4, d), enum(3, c), enum(2, b), enum(1, a)], 1) ? creep 
    Call: (7) create_arcs([a-b, c-d, d-a], [enum(4, d), enum(3, c), enum(2, b), enum(1, a)], _G2635) ? creep 
    Call: (8) lists:member(enum(_G2776, a), [enum(4, d), enum(3, c), enum(2, b), enum(1, a)]) ? creep 
    Exit: (8) lists:member(enum(1, a), [enum(4, d), enum(3, c), enum(2, b), enum(1, a)]) ? creep 
    Call: (8) lists:member(enum(_G2777, b), [enum(4, d), enum(3, c), enum(2, b), enum(1, a)]) ? creep 
    Exit: (8) lists:member(enum(2, b), [enum(4, d), enum(3, c), enum(2, b), enum(1, a)]) ? creep 
    Call: (8) create_arcs([c-d, d-a], [enum(4, d), enum(3, c), enum(2, b), enum(1, a)], _G2774) ? creep 
    Call: (9) lists:member(enum(_G2788, c), [enum(4, d), enum(3, c), enum(2, b), enum(1, a)]) ? creep 
    Exit: (9) lists:member(enum(3, c), [enum(4, d), enum(3, c), enum(2, b), enum(1, a)]) ? creep 
    Call: (9) lists:member(enum(_G2789, d), [enum(4, d), enum(3, c), enum(2, b), enum(1, a)]) ? creep 
    Exit: (9) lists:member(enum(4, d), [enum(4, d), enum(3, c), enum(2, b), enum(1, a)]) ? creep 
    Call: (9) create_arcs([d-a], [enum(4, d), enum(3, c), enum(2, b), enum(1, a)], _G2786) ? creep 
    Call: (10) lists:member(enum(_G2800, d), [enum(4, d), enum(3, c), enum(2, b), enum(1, a)]) ? creep 
    Exit: (10) lists:member(enum(4, d), [enum(4, d), enum(3, c), enum(2, b), enum(1, a)]) ? creep 
    Call: (10) lists:member(enum(_G2801, a), [enum(4, d), enum(3, c), enum(2, b), enum(1, a)]) ? creep 
    Exit: (10) lists:member(enum(1, a), [enum(4, d), enum(3, c), enum(2, b), enum(1, a)]) ? creep 
    Call: (10) create_arcs([], [enum(4, d), enum(3, c), enum(2, b), enum(1, a)], _G2798) ? creep 
    Exit: (10) create_arcs([], [enum(4, d), enum(3, c), enum(2, b), enum(1, a)], []) ? creep 
    Exit: (9) create_arcs([d-a], [enum(4, d), enum(3, c), enum(2, b), enum(1, a)], [arc(4, 1)]) ? creep 
    Exit: (8) create_arcs([c-d, d-a], [enum(4, d), enum(3, c), enum(2, b), enum(1, a)], [arc(3, 4), arc(4, 1)]) ? creep 
    Exit: (7) create_arcs([a-b, c-d, d-a], [enum(4, d), enum(3, c), enum(2, b), enum(1, a)], [arc(1, 2), arc(3, 4), arc(4, 1)]) ? creep 
    Exit: (6) enumerate([a-b, c-d, d-a], [enum(4, d), enum(3, c), enum(2, b), enum(1, a)], [arc(1, 2), arc(3, 4), arc(4, 1)]) ? creep 
N = [enum(4, d), enum(3, c), enum(2, b), enum(1, a)], 
A = [arc(1, 2), arc(3, 4), arc(4, 1)] . 
+0

を別のルールの中で呼び出すため、完全なリストを渡すにはどうしたらいいですか?あなたはどうしてそんなに楽に行こうか? – keont

+2

@keont misspent youth ... – BretC

+0

別のルール@BretCの中でそれを呼び出すにはどうすればいいですか?のように、私はリストを旅行しなければならない、いくつかの操作を行います。プロローグに名前がありますか?他のルールの中にルールを呼び出す – keont

関連する問題