Jak vytisknout všechny uzly z určitého uzlu

0

Otázka

Mám následující knowledge base:

connects(1,11,10,8).
connects(1,12,2,6).
connects(1,13,-3,-2).
connects(1,14,1,-5).

Mám tyto predikáty:

friends(Node, L):-
findall(X,(connects(Node,X,_,_);connects(X,Node,_,_)),L).

když jsem se na otázku ?- přátelé, (1,L) mám tento:

L = [11, 12, 13, 14].

Ale mým cílem je, vytisknout seznam, jako je tento:

L = [11,10,8,12,2,6,13,-3,-2,14,-5]

Jak mohu dosáhnout?

prolog
2021-11-22 21:14:05
2

Nejlepší odpověď

1

Není mi jasné, jaký vztah predikátu vlastně představuje. Stejně můžete postupovat následovně:

  • Za prvé, použijte findall sbírat data, která potřebujete jako seznam seznamů:
?- findall([X,Y,Z], connects(1,X,Y,Z), L).
L = [[11, 10, 8], [12, 2, 6], [13, -3, -2], [14, 1, -5]].
  • Po tom, můžete použít přidávací , aby si srovnat seznam:
?- findall([X,Y,Z], connects(1,X,Y,Z), L0), append(L0, L1).
L0 = [[11, 10, 8], [12, 2, 6], [13, -3, -2], [14, 1, -5]],
L1 = [11, 10, 8, 12, 2, 6, 13, -3, -2, 14, 1, -5].

Dát to všechno dohromady, můžete definovat přátelé/2 jako:

friends(Node, L1):-
   findall([X,Y,Z],
           ( connects(Node, X,Y,Z)
           ; connects(X, Node, Y,Z) ), L0),
   append(L0, L1).
2021-11-23 00:40:16
1

Za předpokladu, že jste může změnit predikát. Výměna _s s proměnnými vám hodnoty, které potřebujete. A pak použít flatten/2 otočit matici (2D seznamu) do jednoduché 1D seznamu.

To by mělo vyřešit váš problém.

friends(Node, L):-
    findall([X, Y, Z], (connects(Node, X, Y, Z)), A),
    flatten(A, L).

Příklad výstupu:

?- friends(1, L)
L = [11, 10, 8, 12, 2, 6, 13, -3, -2, 14, 1, -5]
2021-11-23 00:37:53

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................