5개의 집이 있는데, 집마다 색깔이 다르고, 그 집에는 각기 다른 나라의 사람들이 살고 있습니다.
기르는 애완동물도 다르고, 좋아하는 것과 싫어하는 것도 다릅니다. 다양한 브랜드의 담배. 현재 알려진 정보는 다음과 같습니다
영국인들은 빨간 집에 산다.
스페인 사람(스페인 사람)이 개(개)를 키웠습니다.
노르웨이인들은 왼쪽 첫 번째 집에 산다.
노란집 사람들은 쿨스 브랜드 담배를 즐겨 피운다.
체스터필드 담배를 피우는 남자와 여우를 키우는 남자는 이웃이다.
노르웨이인들은 청와대 옆에 산다.
윈스턴 담배를 피우는 남자는 달팽이를 키운다.
럭키스트라이크 담배를 피우는 사람들은 오렌지 주스를 즐겨 마신다.
우크라이나 사람들은 차를 마시는 것을 좋아합니다.
일본의 연기의회 브랜드 담배.
쿨스 담배를 피우는 남자와 말을 키우는 남자는 이웃이다.
커피를 좋아하는 사람들은 비닐하우스에 산다.
상아집 오른쪽(사진 오른쪽)에 녹색집이 있다.
중간집 사람들은 우유 마시는 걸 좋아한다.
위의 조건을 바탕으로 어느 집에 얼룩말을 키우는 사람이 있고, 어느 집에 물을 좋아하는 사람이 있는지 알려 주실 수 있나요?
아니면 모든 것을 제자리에 놓을 수 있나요?
이것은 일반적인 조건부 문제로, 각 조건에 따라 최종 답을 찾을 때까지 일부 상황을 제외할 수 있습니다.
다만, 이 문제는 조건이 너무 많아서 수동으로 답변하는데 시간이 많이 걸리게 됩니다
. 우리는 이 시간을 프로그램을 작성하고 컴퓨터가 질문에 답하도록 하는 데 사용할 수도 있습니다. 실제로 프로그래밍은 수동 계산보다 시간이 덜 걸립니다!
이런 유형의 문제를 해결하기 위해 프롤로그를 사용하려면 일반적으로 '선택 후 확인' 방법을 사용합니다. 즉, 어떤 방법을 사용하여 일련의 가능한 해결책을 제안한 다음 검증 부분을 사용하여 해결책이 문제의 의미에 맞는지 여부를 판단합니다. 답을 찾을 때까지
.
먼저 가능한 해결 방법이 얼마나 많은지 분석해 보겠습니다.
집마다 색깔이 달라서 색깔별로 5가지에요! 사람에게는 피부색, 국적, 애완동물, 담배, 술이라는 다섯 가지 특성이 있습니다. 즉 하나의 ***에 5!*5개의 상황, 즉 600개의 상황이 있습니다.
프로그램을 사용하면 모두 열거할 수 있습니다.
다음은 프롤로그를 사용하여 솔루션 프로그램을 작성하는 방법을 설명합니다.
이 프로그램에서는 h(C,N,P,Y,D) 구조를 사용하여 방 정보를 저장합니다. C, N, P, Y, D는 각각 색상,
국적, 애완동물, 담배, 음료에 해당합니다. 방이 5개 있으므로 목록을 사용하여 모든 방에 대한 정보를 저장하세요
. 목록은 다음과 같습니다:
).
X = 5;
X = 3;
아니요
분명히 다음은 목록에서 4에 인접한 요소를 찾습니다. 여기서 목록의 요소는 단순한 숫자입니다
위에서 언급한 방 정보를 나타내는 구조체 h(C, N, P, Y, D)라면 그 기능도 동일합니다
앞서 말씀드린 대로 '선택 후 확인' 방식을 사용하여 답을 찾을 예정인데, 어떻게 선택하나요?
? 이전에 소개된 member/2 조건자가 여기서 사용됩니다. member/2의 정의를 아직도 기억하시나요?
member(A,).
예
Prolog 술어는 여러 가지 방법으로 사용될 수 있으므로 member/2도 다음 용도로 사용할 수 있다고 말한 적이 있습니다.
목록의 모든 요소를 탐색합니다. -멤버(X,).
X = 1;
X = 2;
X = 3;
X = 4 ;
X = 5 ;
아니요
이것이 바로 우리에게 필요한 기능입니다. 이 기능을 사용하면 모든 상황을 선택할 수 있습니다.
위의 준비가 완료되면 정식으로 답변 부분을 작성할 수 있습니다. 먼저 프로그램을 나열한 후
설명해 보겠습니다.
문제를 해결하기 위한 술어는solve/3이다. 첫 번째 매개변수는 물 마시는 사람들을 위한 방
이다.
solve(X,TT,TTT):-
%먼저 X를 방 목록으로 바인딩합니다. 현재 방의 속성을 결정할 수 없으므로 변수는 다음과 같습니다. 사용
대표.
(C4,N4,P4,
Y4,D4),h(C5,N5,P5,Y5,D5)],
% 영국인 (영국인) 빨간(빨간) 집에 살아요.
member(Z1,X), %먼저 X 목록에서 방 Z1을 선택하고,
color(Z1,red), %Z1의 색상은 빨간색입니다.
nation(Z1,englishman), %Z1에 사는 사람들은 영국인입니다. 아래도 마찬가지입니다.
%스페인 사람에게는 개가 있습니다.
멤버(Z2,X),
애완동물(Z2,개),
국가(Z2,스페인 사람),
% 노르웨이인들은 왼쪽 첫 번째 집에 산다.
첫번째(Z3,X),
국가(Z3,노르웨이인),
노란 집에 사는 %의 사람들은 kools 브랜드 담배를 피우는 것을 좋아합니다.
멤버(Z4,X),
yan(Z4,kools),
color(Z4,yellow),
% 체스터필드 담배를 피우는 사람은 여우를 키우는 사람 옆집에 있다.
멤버(Z5,X),
애완동물(Z5,fox),
next(Z6,Z5,X), %use next(Z5, Z6,X도 마찬가지입니다.)
yan(Z6,chesterfields),
% 노르웨이인은 청와대 옆에 산다.
멤버(Z7,X),
색상(Z7,blue),
다음(Z8,Z7,X),
국가(Z8, 노르웨이),
윈스턴 담배를 피우는 사람들의 %가 달팽이(달팽이)를 가지고 있습니다.
멤버(Z9,X),
얀(Z9,윈스턴),
애완동물(Z9,달팽이),
% 럭키 스트라이크 담배를 피우는 사람들은 오렌지 주스를 마시는 것을 좋아합니다.
멤버(Z10,X),
음료수(Z10,'오렌지주스'),
얀(Z10,'럭키스트라이크'),
p> p>
% 우크라이나인은 차를 마시는 것을 좋아합니다.
멤버(Z11,X),
국가(Z11,우크라이나),
음료(Z11,차),
% 일본인은 의회 브랜드 담배를 피웁니다.
회원(Z12,X),
국가(Z12,일본어),
연(Z12,의회),
% 쿨스 담배를 피우는 남자와 말을 키우는 남자는 이웃이다.
멤버(Z13,X),
애완동물(Z13,말),
다음(Z14,Z13,X),
yan(Z14,kools),
커피를 좋아하는 사람들의 %가 온실에 살고 있습니다.
멤버(Z15,X),
색상(Z15,녹색),
음료수(Z15,커피),
% 녹색집은 상아집 오른쪽(사진 오른쪽)에 있습니다.
member(Z16,X),
color(Z16,ivory),
next(Z17,Z16,X), %여기에서는 사용하지 않습니다. 오른쪽 조건이지만 이웃이라고 가정하므로 최종 답은 두 가지입니다.
color(Z17,green), % 이 점은 직접 수정해 주시기 바랍니다. 물론, 우변을 판단하려면
술어도 작성해야 합니다.
%중간집 사람들은 우유 마시는 걸 좋아해요.
middle(Z18,X),
drink(Z18,milk),
% 위의 모든 조건이 우리의 질문에 대답해 보겠습니다.
%반려동물이 얼룩말인 방을 찾아보세요.
회원(TT,X),
애완동물(TT,얼룩말),
%물을 마실 수 있는 방을 찾으세요.
회원(TTT,X),
음료(TTT,물).
이 프로그램을 읽는 데 문제가 없을 것입니다. 이는 단순히 우리의 조건을 Prolog 언어로 직접 변환합니다. 예:
%체스터필드 담배를 피우는 사람과 여우를 키우는 사람은 이웃입니다.
멤버(Z5,X),
애완동물(Z5,fox),
next(Z6,Z5,X), %use next(Z5, Z6,X도 마찬가지입니다.)
yan(Z6,chesterfields),
언어로 설명하면 다음과 같습니다. 먼저 Z5는 멤버(Z5,X)에 해당하는 집이고 그 다음 애완동물은 여우입니다. p >
, pet(Z5,fox)에 해당; 이웃은 Z6, next(Z6,Z5,X)에 해당, Z6의 마지막 사람이 yan(에 해당)을 그립니다. Z6, 체스터필드). 원래 조건을 약간만 분해하면
프롤로그 프로그램이 됩니다.
ㅎㅎ 그런 프로그램은 누구나 프로그래밍할 수 있어요. 프롤로그의 장점이 보이더라고요. Prolog는 설명적 언어입니다. Prolog 언어로 문제를 설명하기만 하면 컴퓨터가 나머지 작업을 수행합니다. :) C, Basic 등 다른 언어를 사용한다면 프로그램 흐름을 스스로 고려해야 하므로
이러한 언어를 절차적 언어라고 합니다. 프롤로그보다 훨씬 낮은 수준입니다.
자, 드디어 프로그램을 실행해 보겠습니다.
- 풀기(X,TT,TTT).
X = [h(노란색,노르웨이어,여우,쿨스,물),h(파란색,우크라이나어,말,
체스터필드, 차),
h(red,englishman,snails,winston,milk),h(iory,spaniard,dog,'럭키
스트라이크','오렌지 주스'),
h(녹색,일본어,제브라,의회,커피)]
TT = h(녹색,일본어,제브라,의회,커피)
TTT = h (노란색,노르웨이어,여우,쿨스,물) ;
X = [h(노란색,노르웨이어,여우,쿨스,물),h(파란색,우크라이나어,말,
chesterfields,tea),
h(red,englishman,snails,winston,milk),h(green,japanese,zebra,
의회,커피),
h(ivory,spaniard,dog,'Lucky Strike','orange juice')]
TT = h(green,japanese,zebra,parliaments,coffee)
TTT = h(yellow,norwegian,fox,kools,water)
no
13번째 조건의 질문에서는 오른쪽 제한을 사용하지 않았으므로 답이 2개 있습니다. ,
이 두 답변의 마지막 두 방이 정확히 반전되어 있음을 확인할 수 있습니다.
답안을 좀 더 아름답게 작성하기 위해 조금만 더 노력하시면 이 프로그램은 완벽할 것입니다.