2011-05-04 3 views
0

프롤로그에서이 질문에 대한 대답 (또는 첫 번째 기능)을 수행하는 방법을 궁금합니다. 내가 말하는 링크는 here입니다.하나의 함수에서이 작업을 수행하는 방법

reverse([X|Y],Z,W) :- reverse(Y,[X|Z],W). 
reverse([],X,X). 
+0

무엇을 의미합니까? 나는 당신이 링크 한 대답에서 단 하나의 "기능"을 볼 수 있습니다. 그것의 2 개의 버전이 있더라도. BTW, "함수"를 말할 때 나는 당신이 "술어"를 의미한다고 가정하고 있습니다. – svick

+0

그래, 나는 술어를 의미하는 것을 유감스럽게 생각하며, 오직 하나의 술어 만 호출하는 방법을 알아낼 수 있기를 원한다. – Abriel

+0

나는 아직도 당신이 의미하는 것을 이해하지 못합니다. 당신은 정교 할 수 있습니까? 어쩌면 예를 들어 주시겠습니까? – svick

답변

0

당신이하려고하는 이유는 술어에 대한 하나의 절을 원하는 무엇 :

는 여기에 내가 하나의 술어를 호출하여 무엇을 의미하는지의 예?
개인적으로 나는 많은 절을 쓸 수있는 능력이 프롤로그의 위대한 것 중 하나라는 것을 믿습니다. 코드는 더 우아하고 읽기 쉽습니다.

어쨌든 또는을 사용하고 싶을 것입니다.

foo(Arg11,Arg12,Arg13):- 
    (Body1). 

foo(Arg21,Arg22,Arg23):- 
    (Body2). 

foo(Arg31,Arg32,Arg33):- 
    (Body3). 

먼저 모든 절은 같은 인수가 있는지 확인해야합니다 (안녕히 패턴이 일치!) :

foo(Arg1,Arg2,Arg3):- 
     (Body1b). 
foo(Arg1,Arg2,Arg3):- 
     (Body2b). 
foo(Arg1,Arg2,Arg3):- 
     (Body3b). 

을 그리고 당신은 (사용하거나합니다 다음과 같은 조항을 가지고 가정) : 예

foo(Arg1,Arg2,Arg3):- 
    (Body1b) 
    ; (Body2b) 
    ; (Body3b). 

,

reverse([X|Y],Z,W):- 
    reverse(Y,[X|Z],W). 
reverse([],X,X). 
0

이 될 것입니다 : 다음

reverse(X,Y,Z):- 
    X = [H|T], 
    reverse(T,[H|Y],X). 
reverse(X,Y,Z):- 
    X = [], 
    Z = Y. 

과 : 귀하의 첫 번째 게시물의 예에 관한

reverse(X,Y,Z):- 
    (X = [H|T], 
    reverse(T,[H|Y],X)) 
    ; (X = [], 
     Z = Y). *%ew ew ugly!* 

, 두 가지 조건이있다, 각각 하나의 절을 가지고. 두 번째 술어는 2 개의 인수를 가지며 첫 번째 술어는 1을 가지므로 서로 다릅니다. 그것들을 "병합"하는 유일한 방법은 첫 번째 대신에 두 번째 것을 has_equal_sums (List, _)로 호출하는 것입니다.

솔직히 말해서, 나는이 일을하는 것이 중요하지 않다. 나는 당신이 어떤 중요한 스피드 업도 얻지 못할 것이고 코드가 더 복잡해지기를 의심한다.
물론 당신의 코드이고 우리가 알지 못하는 제한이있을 수 있습니다. (그래서 내가 원하는 것을 물었습니다)

+0

나는 당신이 어디에서 왔는지를 완전히 이해하고 있으며 아마 더 지저분하다. 나는 단지 그것이 같은 기능을하는 방법을 찾을 수 있기를 원하지만 단지 하나의 술어를 주 호출로 사용한다. – Abriel

+0

만약 내가이 질문을 이해한다면, 하나의 술어를 하나의 술어에만 쓰는 것이 아니라 하나의 술어 (아마도 많은 절이있는)를 사용하는 것에 관한 것입니다. 당연히 구현에 대한 그러한 인위적 제약은 인간이 읽을 때 어려울 수 있습니다. – hardmath

+1

huum, 하나의 술어, 많은 절 ... 우리는 "마스터"술어 인 myprogram/2를 사용할 수 있습니다. 첫번째 인수는 술어 이름이고 두 x 째 인수는 인수 목록입니다.myprogram (아버지, [존, 케빈]) 같은 것. 아버지 (X, Z), 아버지 (Z, Y) : 그리고 나서 우리는 또는을 사용하여 하나의 절에 넣을 수 있습니다. (myprogram (mother, (liz, kevin) .LOL –

관련 문제