2014-04-14 1 views
0

사용자가 작은 따옴표 붙은 문자열 (A)을 입력 할 수있는 기능을 가지고 있으며 하위 목록 (X)을 검색하여 해당 문자열을 포함하는 하위 목록을 반환합니다. 문자열 : 내가 ELSE 절에서 A 변수를 사용할 때Prolog : ELSE 절 내에서 문자열 데이터가 올바르게 표시되지 않습니다.

process(6, X) :- 
nl, write('\tEnter student name or ID: '), 
read(A), 

% FIRST WE CHECK FOR A in the ID SLOT 
member( [A,B,C] , X) 

% IF TRUE, DISPLAY DATA THEN PASS X back to menu 
-> write('\tID="'), write(A), write('", Name="'), write(B), write('", Grade='), write(C),nl,nl, menu(X) 

% ELSE, WE CHECK FOR A in the NAME SLOT 
; write(A), write(' not found in ID slot'), nl, checkNAME(A, X). 

checkNAME(A,X) :- 
    member([B,A,C] , X) 

    % IF TRUE (A in NAME SLOT) 
    -> blah blah 

    % ELSE 
    ; blah blah 

내 문제는, 내가 정크 데이터 "L1_233"또는 w/E를 얻을이 제대로 작동에서 ELSE 절을 방지 할 수 있습니다. 나는 A의 복사본을 만들어 ELSE 절에서 사용하려고 시도했지만, 모든 것은 정크 데이터 복사본을 생성하는 것입니다. 변수 A가 IF CLAUSE에서는 작동하지만 ELSE에서는 작동하지 않는 이유는 무엇입니까? 감사합니다.

답변

2

운영자 우선 순위 문제가 있습니다.

프롤로그에서 "AND"(쉼표)의 우선 순위는 ->보다 높습니다. 따라서 nl, write(...), read(A)은 모두 상반기 (앞선)의 부분으로 간주됩니다 (->). 전조사가 실패하면 Prolog는 read(A) 전의 지점으로 되돌아 가고 "else"경로를 취하면 A은 초기화되지 않습니다. 당신은 괄호로해야

process(6, X) :- 
nl, write('\tEnter student name or ID: '), 
read(A), 

% FIRST WE CHECK FOR A in the ID SLOT 
( member( [A,B,C] , X) 

% IF TRUE, DISPLAY DATA THEN PASS X back to menu 
-> write('\tID="'), write(A), 
    write('", Name="'), write(B), 
    write('", Grade='), write(C), 
    nl,nl, menu(X) 

% ELSE, WE CHECK FOR A in the NAME SLOT 
; write(A), write(' not found in ID slot'), 
    nl, checkNAME(A, X) 
). 

"AND"(쉼표)도 "OR"(세미콜론)보다 우선 순위 그래서 괄호 그룹은 필연적와 다른 및 시퀀스 필요하지 않습니다.

+0

감사합니다. 항상 내 PC를 몇 시간 동안 쳐다 보지 않는 단순한 무언가. – GeorgeCostanza

+0

@GeorgeCostanza 예, 여러 번 사실입니다! – lurker

관련 문제