2017-10-26 19 views
0

내 목록에 요소로 많은 사실이 포함되어 있습니다. 번호가 목록의 구성원인지 여부를 검색하고 싶습니다.모서리 목록에서 꼭지점을 구하십시오.

내 프로그램에서 가장자리 사실을 정의했습니다. 이제 노드 1이 목록의 구성원인지 확인하고 싶습니다.

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

좋은 문제는 무엇입니까? 소원? 이것이 AI와 어떤 관련이 있습니까? –

답변

1

목록에있는 사실의 유형을 알아야합니다. 사실 가장자리의 형태를 취한다고 가정

(유, 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

재귀의 힘 프롤로그를 학습 할 때 프롤로그를 무시할 수 없습니다.

여기서 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). 

또는 두 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] .