2011-11-19 5 views
7

나는 프롤로그를 배우려고 노력했고, 술어가하는 일에 완전히 몰두했다. 자주 사용되는 것을 볼 수 있으며 Prolog에 대한 인터넷 자원이 너무 적어서 대답을 찾을 수 없습니다.s() 술어는 Prolog에서 무엇을합니까?

Ex.

/* sum(Is,S) is true if S is the sum of the list of integers Is.   */ 
    sum([],0). 
    sum([0|Is],S):-sum(Is,S). 
    sum([s(I)|Is], s(Z)):-sum([I|Is],Z). 
+0

어떤 프로 로그 인터프리터 버전을 사용합니까? –

+0

다음과 같이 사용합니다 : amd64 용 SWI-Prolog 버전 5.10.1 – okin33

답변

14

s/1 자체는 아무 것도하지 않으며 실제로는 술어가 아닙니다. 그것들은 단순한 용어 일 뿐이며, 인수의 후계자를 나타냅니다. 따라서, s(0)0 (즉, 1)의 후속을 나타 내기 위해 사용되며, (즉, 2)의 후속을 나타 내기 위해 s(s(0))이 사용됩니다. Prolog는 기호 계산을 수행하는 언어로서 매우 유용하기 때문에 Prolog에 널리 퍼져있는 반면, 단순한 산술 연산조차 clunky로 느껴지므로 프로그래밍 패러다임과 완벽하게 통합되지 않습니다.

+8

멋지게 말했듯이, + s (0) XD –

+1

이것은 s/1을 사용하는 프로그램의 출력이 왜 이상했는지 설명합니다. 대단히 감사합니다, 훌륭한 설명! – okin33

1

s/1은 후속을 나타냅니다. 논리적으로 액세스 할 수있는 방식으로 숫자를 표현하는 데 사용됩니다.

+1

대단히 감사합니다! 그러나 s/1을 사용하는 프로그램 수를 실행하려고하면 이상한 출력이 ? - mycount (a, [a, a], N) 형식으로 나타납니다. N = s (s (0)); N = s (0); N = s (0); N = 0; 거짓. – okin33

0

이것은 Prolog 구현에 따라 다릅니다. 후임자 - 술어를 말합니다. this을 참조하십시오.

+1

's (X)'는 구현과 관련이 없습니다. 그것은 임의의 functor입니다. 대신't (X)'또는'succ (X)'를 시도해보십시오. – false

관련 문제