2017-10-26 3 views
0

私のリストには要素として多くのファクトが含まれています。リストのメンバーであるかどうか検索したいと思います。辺のリストから頂点を取得する

ここで私のプログラムでエッジファクトを定義しました。次に、ノード1がリストのメンバーであるかどうかを確認したいと思います。

?-my([edge(1,2),edge(2,3),edge(1,4)],1,L). 
false. 
+2

ニースの問題、あなたのqは何ですか?うつ病?これはAIと何が関係していますか? –

答えて

1

あなたは、リストにある事実の種類を知っている必要があります。事実はエッジの形をとると仮定すると

(u、v)はは、以下の非常に単純な述語は、実行する必要があります。

node_exists(Node, [edge(U,_V)|_]) :- 
    U =:= Node, 
    !. 
node_exists(Node, [edge(_U,V)|_]) :- 
    V =:= Node, 
    !. 
node_exists(Node, [_|R1]) :- 
    node_exists(Node, R1). 

サンプルクエリ:

?- node_exists(3, [edge(1,2),edge(2,3),edge(1,4)]). 
true. 

?- node_exists(2, [edge(1,2),edge(2,3),edge(1,4)]). 
true. 

?- node_exists(6, [edge(1,2),edge(2,3),edge(1,4)]). 
false. 
-1

再帰はの力でありますPrologを学習するときにPrologを無視することはできません。

btwは、ノードがリストに何回存在するかを調べるソリューションです。

lits([H|_],E) :- 
    element(H,E).  
lits([_H|T],E) :- 
    lits(T,E). 

element(edge(A,_B),A). 
+0

ありがとうございました –

+0

大歓迎です:-) –

2

単純な二ライナー述語:

has_node(UV,L) :- 
    member(edge(U,V), L), 
    (UV = U; UV = V). 

または2つのmember/2述語使用して:

has_node(UV,L) :- 
    member(edge(U,V), L), 
    member(UV, [U,V]). 

、私たちはその後、複数の方向にそれを照会することができます

?- has_node(N, [edge(1,2),edge(2,3),edge(1,4)]). 
N = 1 ; 
N = 2 ; 
N = 2 ; 
N = 3 ; 
N = 1 ; 
N = 4. 

?- has_node(2, [edge(1,2),edge(2,3),edge(1,4)]). 
true ; 
true ; 
false. 

?- has_node(2,L). 
L = [edge(2, _G1245)|_G1248] ; 
L = [edge(_G1244, 2)|_G1248] ; 
L = [_G1247, edge(2, _G1245)|_G1251] ; 
L = [_G1247, edge(_G1244, 2)|_G1251] ; 
L = [_G1247, _G1250, edge(2, _G1245)|_G1254] ; 
L = [_G1247, _G1250, edge(_G1244, 2)|_G1254] ; 
L = [_G1247, _G1250, _G1253, edge(2, _G1245)|_G1257] . 

?- has_node(A,L). 
L = [edge(A, _G1257)|_G1260] ; 
L = [edge(_G1256, A)|_G1260] ; 
L = [_G1259, edge(A, _G1257)|_G1263] ; 
L = [_G1259, edge(_G1256, A)|_G1263] ; 
L = [_G1259, _G1262, edge(A, _G1257)|_G1266] ; 
L = [_G1259, _G1262, edge(_G1256, A)|_G1266] . 
関連する問題