2011-11-26 3 views
1

기본 Prolog에서 패러다임을 이해하기 어려운 언어로 도움을 요청합니다. 나는 다른 언어들 (C++, Lisp, Java, Assembly 등)에 익숙하지만 Prolog와 완전한 초보자이다.프롤로그에서 2D 배열로 작업

해결해야 할 사항 - 기본 영어 : 2 개의 매개 변수가있는 경우 2D 배열에서 해당 번호를 찾으십시오.

문제는 숫자를 골라 내고 그 번호의 색깔을 선택한 다음 주어진 숫자가 들어있는 집을 골라달라고 웹에 두뇌없이 쉬운 퍼즐입니다. 퍼즐은 각 색상/집 조합에 대해 하나의 숫자 만 있도록 설정됩니다.

function guess(Color, Houses) :- 
<--Need what goes here --> 

green(1, 15, 23, 24). 
pink(2, 6, 10, 18). 
etc... 

houseA(2, 4, 7, 14). 
etc... 

코드는 올바른 번호를 선택하는 색상과 주택을 일치해야합니다 장소에 현재 어떤

. 그래서 예를 들면, 주어진 "?- guess(pink, houseA)""Your number is 2."

나는 프롤로그에서이를 구현하는 방법에 대한 아이디어를 쓰고있다 반환해야하고 그들 중 누구도 더 이상 저에게 없습니다. 어떤 색상을 검색해야하는지, 집과 색상간에 어떤 숫자가 일치 하는지를 확인하는 방법, 심지어 값을 "반환"하는 방법까지도 if/else 문을 구현하는 방법을 모르겠습니다.

나는 언어에 대해 요점을 놓치거나 길을 잃어 버렸다.

도움을 주시면 감사하겠습니다. 고맙습니다!

답변

1

값을 반환하려면 술어에 다른 매개 변수가 필요합니다 (함수 btw가 아님). 이 매개 변수는 자유 변수이며 결과에 바인딩합니다.

프롤로그 사양에는 이러한 매개 변수가 표시됩니다. 이미 매개 변수가 기록되어있는 동안 매개 변수가 + 매개 변수와 매개 변수가 모두 바인딩되고 해제 될 수 있습니까? 매개 변수.

% guess/3 (specify the arity of your predicate) 
% guess(+Color, +House, -Result) (give info about your parameters) 
% guess finds a color shared by Color and House and binds it to Result. 

그런 다음, houseA, 핑크 등의 술어 등등에서 번호를 찾을 위대한되지 않습니다 같은 그래서 여기 당신을 위해 당신은 코멘트를 가질 수있다. 당신은 목록에 저장된 번호를함으로써 더 적응 술어로를 설정할 수 있습니다 :

green([1, 15, 23, 24]). 
pink([2, 6, 10, 18]). 
houseA([2, 4, 7, 14]). 

우리가 그 목록을 도착했을 때, 우리가 쓸 수 있습니다 :

guess(Color, House, Result) :- 
    call(Color, Pool1), 

당신이 추측 (핑크, houseA)를 호출하면, 당신의 술어를 Pool1이라는 인수로 핑크색으로 표시 할 때, 프롤로그는 Pool1과 [2, 6, 10, 18]을 일치 시키려고 시도 할 것이므로 Pool1은이 목록에 정확하게 바인딩 될 것입니다.

call(House, Pool2), 

houseA 및 Pool2와 동일합니다.

member(Result, Pool1), 

이제 우리는 우리가 우리의 결과는 POOL1

member(Result, Pool2), 

의 구성원 Pool2의 구성원이어야 할 그 프롤로그를 말한다.

write('Your number is '), 
    write(Result), 
    write(.), 
    nl. 

마지막으로 메시지를 표시합니다.

프롤로그는 결과를 R = x로 표시합니다. 그 아래의 거짓, 당신이 원하지 않는다면; 잘못된 부분, 당신은이 "컷"을 추가 할 수 있습니다!

nl. 

=>

nl, 
    !. 

/0 술어 (컷) 다른 해결책을 찾기 위해 시도 철수하지 프롤로그 알려줍니다. 프롤로그가 왜 하나의 결과와 거짓으로 선택을 반환했는지 설명하는 내용이 회원에게 되돌아 왔을 것입니다.

희망이 있습니다. 어떤 부분을 이해하는 데 문제가 있다면 그렇게 말하면 정보를 알려줄 것입니다.

+0

매우 유용한 답변 - 감사합니다! 프로그램이 작동하지만 2 개의 쿼리가 있습니다. 먼저 "호출"이란 무엇입니까? 필자는 목록의 이름과 매개 변수를 비교하는 내장 함수를 사용하지만 모든 언어에 대해 이상하게 보입니다. 둘째, 내 프로그램 출력은 다음과 같습니다. "사용자 번호는 25입니다. 번호 = 25" 그는 충분하지 못하지만, 선생님은 Lisp-y 아이디어처럼 보이는 프롤로그 패러다임을 짧게 설명했습니다. 평가 된 마지막 값을 반환합니다. 이 작업은 Prolog에서 어떻게 작동합니까? Prolog에게 두 번째 줄을 인쇄하지 말라고 어떻게 말합니까? –

+0

통화 부분에 대해서는 swi-pl 매뉴얼 [here] (http://www.swi-prolog.org/pldoc/doc_for?object=call/2)을 참조 할 수 있습니다. 이것은 기본적으로 술어 보류를 실행하는 술어입니다 당신이 인수로 첫 번째 인수로 전달한 이름으로 두 번째 인수로 전달합니다. 호출은 2에서 원하는만큼 많은 수의 arits에 대해 정의됩니다 (인터프리터 모드에서는 6 개). 기본적으로 인터프리터 모드에서 최대 5 개의 인수를 처리하는 조건부에 대해 호출 할 수 있습니다. 두 번째 부분에서는, 나는 프롤로그가 통일에 관한 그의 시도를 뿌리 째 뽑지 못하게하는 방법을 모른다. 그러나 다른 사람들은 나보다는 더 많은 통찰력을 가지고 있을지도 모른다. :) – m09

1

집과 색상에 대한 술어/논리/사실을 설정 한 다음, 프롤로그가 배열에서 룩업을 작성하는 대신에 그것을 해결할 수 있다고 생각합니다.

관련 문제