내 목록에 요소로 많은 사실이 포함되어 있습니다. 번호가 목록의 구성원인지 여부를 검색하고 싶습니다.모서리 목록에서 꼭지점을 구하십시오.
내 프로그램에서 가장자리 사실을 정의했습니다. 이제 노드 1이 목록의 구성원인지 확인하고 싶습니다.
?-my([edge(1,2),edge(2,3),edge(1,4)],1,L).
false.
내 목록에 요소로 많은 사실이 포함되어 있습니다. 번호가 목록의 구성원인지 여부를 검색하고 싶습니다.모서리 목록에서 꼭지점을 구하십시오.
내 프로그램에서 가장자리 사실을 정의했습니다. 이제 노드 1이 목록의 구성원인지 확인하고 싶습니다.
?-my([edge(1,2),edge(2,3),edge(1,4)],1,L).
false.
목록에있는 사실의 유형을 알아야합니다. 사실 가장자리의 형태를 취한다고 가정
(유, 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.
재귀의 힘 프롤로그를 학습 할 때 프롤로그를 무시할 수 없습니다.
여기서 btw는 노드가 목록에 몇 번 있는지 찾아내는 솔루션입니다.
lits([H|_],E) :-
element(H,E).
lits([_H|T],E) :-
lits(T,E).
element(edge(A,_B),A).
고맙습니다. –
대다수 환영 :-) –
간단한 두 라이너 조건 :
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] .
을
좋은 문제는 무엇입니까? 소원? 이것이 AI와 어떤 관련이 있습니까? –