2017-10-24 17 views
1

두 멤버의 백 체인 프로 시저를 그려서 멤버의 구현이 더 효율적인지 결정하려고합니다.프롤로그 표준 멤버/2 대 멤버/2가 추가로 구현 되었습니까?

표준 구현 :

isMember(X,[X|Tail]). 
isMember(X,[H|Tail]) :- isMember(X,Tail). 

추가] 구현 : (내 수업 노트에서)

appendMember(X,List). 
appendMember(X,List) :- myAppend(List1,[X|List2],List). 

myAppend([],List,List). 
myAppend([H|List1],List2,[H|Result]) :- myAppend(List1,List2,Result). 

내가 TK 이클립스에서 추적을 사용할 때 나는 재귀와 표준 구현에 대한 예상 출력을 얻을 호출하지만 추가 구현은 즉시 성공적으로 종료됩니다.

왜 그런지 궁금하네요. 그리고 append 메소드의 백 체인 프로 시저를 그리는 방법에 대해 궁금합니다.

미리 감사드립니다.

+1

더욱 효율적입니다 ['memberd/2'] (https://stackoverflow.com/a/21971885/772868) – false

답변

2

appendMember(X,List).은 연결되지 않은 인스턴스화되지 않은 변수이므로 2 개의 인수에 대해 무엇을 가지고 있더라도 즉시 만족됩니다.

이와 같이, 나는 그것을 제거해야한다고 생각합니다.

+0

고마워요! 나는 그것을보고 있었고 백 체인 프로세스를 시작하는 방법을 생각하고 있었습니까? 일단 내가 그것을 제거하면 추적자가 분명히 무슨 일이 일어나고 있는지 보여줍니다. – Ruhe

+0

미안하지만 큰 목록에 대해 어느 것이 더 효율적인지 알고 있습니까? 둘 다 내 테스트 케이스 ... 멤버 (p, [d, f, p, r])에 대해 동일한 양의 단계를 수행하는 것으로 보입니다. – Ruhe

+0

@Ruhe, SWI 프롤로그에는 [런타임 통계 가져 오기]에 대한 술어가 있습니다 (http://www.swi-prolog.org/pldoc/man?section=statistics). – lurker