2016-05-19 50 views
0

我想,給定一個由AB元素形成的列表([ab,bc,cd]),檢查它是否已經存在某個給定元素一個列表(我將返回),如果不是,請添加任何不在輸出列表中的「A」或「B」元素。如何檢查元素是否不在列表中,如果不是,插入它

我還沒有真正找到任何「簡單」的答案讓我理解,但是(例如,我發現一個映射和我從來沒有用過也沒見過的東西)。

所以輸出列表將需要只有[A,B,C,d]

編輯:我想要做的是,我得到這樣調用:

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

我必須返回兩個列表。第一個給節點(與此特定形式:

[enum(1,a),enum(2,b),enum(3,c),enum(4,d)],表示節點之間

和第二個給出了圓弧(的conections)

所以我的部分,我「知道」。如何計算並以列表返回的項目,但我不知道以下內容:

- 如何在一個列表

- 如何只插入獨特的元素,首先檢查,如果「A」是在列表中,如果不插入它,然後檢查「B」是否在如果沒有,列表插入它(原因我不知道這一點,我不能用調用規則的方式,一旦完成,兩次,每次元素一次,遞歸的每一步,沒有犯錯

+1

你需要展現你想達到什麼樣的一個例子查詢。該說明本身並不清楚。您可能還會顯示一條可找到的最接近答案的鏈接,並可能提出一個具體問題。 「映射和東西」並不真正覆蓋它。 – lurker

+0

好的會做,對不起做得不好(這是我的第三次編輯,我總是儘量不要太短或太長/特定)。 – 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)] . 

如果你做一個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內調用它?如在,我必須旅行一個清單,做幾個操作。在prolog中有一個名字嗎?在另一個內部調用規則? – keont

相關問題