2014-11-03 4 views
0

여기 원자를 문자열로 변환하려고하는 간단한 프로그램이 있습니다. 이 경우 atom_number을 사용했습니다.프롤로그에서 문자열을 숫자로 변환

코드 -

min(P1, P2) :- 
    atom_number(P1, L1), 
    atom_number(P2, L2) 
    L1 > L2 -> 
    (
     writeln('L2 id min'), 
     writeln(L2) 
    ); 
    L1 < L2 -> 
    (
     writeln('L1 is mean'), 
     writeln(L1) 
    ). 

내가 파일을 실행할 때 -

swipl -s p1.pro 
1 ?- min('12','13'). 
ERROR: </2: Arguments are not sufficiently instantiated 

유사 내가 입력 매개 변수의 데이터 유형을 알고 싶다면? atom(L1), number(N2) 같은 것을 제외하고?

+1

당신이 L2 뒤에 쉼표를 누락)? 나는 또한'? - gtrace, min ('12 ','13 ')로 진행하는 것이 좋습니다. – User

답변

2

여기에 if-then-else 구조를 사용하는 것이 문제입니다. 원자 대 숫자로의 변환은 첫 번째 if-part의 일부일뿐입니다. 성공하면 술어도 성공합니다. 예 :

?- ?- min('13','12'). 
L2 id min 
12 
true. 

그러나 첫 번째 if 부분이 실패하면 두 번째 if 부분이 평가됩니다. 그러나 이는 원자 대 숫자로의 변환이없는 부등호 L1 < L2으로 구성됩니다.

은 if-당시 다른 구조하기 전에 변환을 배치 할 수있는 솔루션입니다 : 이제

min(P1, P2):- 
    atom_number(P1, L1), 
    atom_number(P2, L2), 
    ( L1 > L2 
    -> writeln('L2 id min'), 
     writeln(L2) 
    ; L1 < L2 
    -> writeln('L1 is mean'), 
     writeln(L1) 
). 

는 당신이 얻을 :

?- min('12','13'). 
L1 is mean 
12 
true. 
+0

@Woulter : 고마워요. 입력 인수의 데이터 유형을 인쇄하는 방법이 있습니까? – user123

+1

@ user123 'Term'을 선택했다면 먼저 compound (Term)이 성공했는지 (compound terms의 경우) 성공했는지 확인할 수 있습니다. 그런 다음'float (Term)','integer (Term)','atom (Term)'그리고'var (Term)'. 필자는 표준 Prolog에서 발생하는 대부분의 유형을 포함한다고 생각합니다. SWI-Prolog에는 Prolog의 다른 구현에 의해 지원 될 수도 있고 지원되지 않을 수도있는 몇 가지 추가 데이터 유형이 있습니다 (이 웹 페이지에 문서화되어 있습니다) (http://www.swi-prolog.org/datatypes.html). –

+0

@Wounter :하지만 '데이터 타입 (term)'처럼'float' 또는'atom'을주는 데이터 타입을 얻지는 못한다고 생각합니다. – user123

관련 문제