또 다른 대안은 입력이 무효 인 경우 돌아 가지에 대한 repeat
을 사용하는 것입니다. 그리고 당신은 메시지와 사용자 입력 패턴 술어 작성할 수 있습니다
read_input(Prompt, Value, CheckPred, ErrorMsg) :-
repeat,
format('~w:~n', [Prompt]),
read(Value),
( call(CheckPred, Value)
-> true, !
; format('ERROR: ~w.~n', [ErrorMsg]),
fail
).
go :-
read_input('Enter your name', Name, check_name, 'Invalid name'),
read_input('Enter your birth year', Year, check_year, 'Invalid year'),
read_input('Enter your birth month', Month, check_month, 'Invalid month'),
read_input('Enter your birth date', Date, check_date, 'Invalid date'),
% Do stuff with Name, Year, Month, Date...
.
을 그리고 검사 술어 만들 :
check_name(Name) :- ...
check_year(Year) :- ...
check_month(Month) :- ...
check_date(Date) :- ...
당신은 쉽게 확장 할 수를 그래서 check_name
도 활용과 같은 몇 가지 "수정 - 업"을 수행 이름.
칙 (당신은 check_...
는 두 개의 인수 등을 가지고있는 것) - 수정 - 업
read_input(Prompt, Res, CheckPred, ErrorMsg) :-
repeat,
format('~w:~n', [Prompt]),
read(Value),
( call(CheckPred, Value, Res)
-> true, !
; format('ERROR: ~w.~n', [ErrorMsg]),
fail
).
% Check argument, and provided "fixed-up" argument xxxOut
check_name(Name, NameOut) :- ...
check_year(Year, YearOut) :- ...
check_month(Month, MonthOut) :- ...
check_date(Date, DateOut) :- ...
나는, 그러나, 전체 날짜를 입력 할 수 있도록 허용하기 추천 할 것입니다/w를 인수 확인 및 그것을 분석하십시오. SWI Prolog에는 그 목적을 위해 사용할 수있는 날짜 술어가 있습니다. 그런 다음 년, 월, 일을 위의 날짜로 바꿀 수 있으며 DateOut
의 경우 birthdate(Month, Day, Year)
과 같은 용어를 사용할 수 있습니다.
네, 그게 문제입니다. check_date (Month, Date)와 같은 check_date 술어에 두 개의 인수를 전달하려면 어떻게해야합니까? 내가 어떻게 해. 제발 도와주세요 – Daybreaker
@luker는 위의 문제를 해결하는 방법을 말해 줄 수 있습니까 ?? – Daybreaker
@Daybreaker 내 업데이트 된 답변보기 – lurker