2009-11-22 6 views
1

다음과 같은 규칙으로 구성된 데이터베이스가 있습니다.프롤로그 목록 질문

speaks(fred [german, english, dutch]). 
speaks(mary [spanish, arabic, dutch]). 
speaks(jim [norwegian, italian, english]). 
speaks(sam [polish, swedish, danish]). 

훨씬 더 큰 프로그램의 일환으로, 어떻게 같은 언어를 사용 삼명을 찾을까요?

+5

그것이 있어야하지 않나요'(프레드는 [독어 , 영어, 네덜란드]). (여분의 쉼표에 유의하십시오)? 또한 :이 숙제가 있습니까? 그렇다면 숙제로 표시하십시오. – Franz

+0

그것에 약간의 냄새가 난다. – nedned

답변

0

그것은 잠시왔다, 그래서 일부 구문 결함이있을 수 있습니다,하지만 난 당신이 아이디어를 얻을 희망 ...

% Find out whether an element is contained in a list 
in_list(X,[X|_]). 
in_list(X,[First|Rest]) :- in_list(X,Rest). 

% Find out 3 people who speak the same language 
findspeakers(Language, X1, X2, X3) :- speaks(X1, L1), speaks(X2, L2), speaks(X3, L3), in_list(Language, L1), in_list(Language, L2), in_list(Language, L3). 

아주 간단한 솔루션을 사용하여 목록 사업자 (I하지 않았다 변수가 목록에 포함되어 있는지 여부를 알아내는 규칙이 내장되어 있는지 다시 한 번 기억해 둔다.) 다음과 같은 명령으로 공통의 언어를 사용 세 사람의 모든 그룹을 찾을 수 있습니다

findspeakers('English', X1, X2, X3). 

:

findspeakers(Language, X1, X2, X3). 

다음과 같은 명령으로 영어를 세 사람의 그룹을 찾을 수 있습니다 참고 :이 명령을 사용하면 세 사람의 그룹을 모두 조합 할 수 있으므로 영어를 사용하는 사람이 4 명인 경우 첫 번째 명령에서 네 가지 결과 집합을 제공합니다.

+0

필자는 피곤할 수도 있지만 반복 허용과 함께 조합을 생성하고 반복을 허용하지 않는 조합은 허용하지 않으므로이 경우 64 개의 결과 집합을 제공한다고 생각합니다. – bcat

+0

또한 'in_list/2'가 수행하는 'member/2'작업을 수행하는 술어가 있습니다. 나는 이것이 ISO 표준에 있다고 생각하지 않지만, 확장으로서 거의 보편적 인 지원을 가져야한다. – bcat

+0

아, 멋지다. 의견에 감사드립니다. 특히 첫 번째 것은 매우 흥미 롭습니다 - 나는 그것을 알지 못했습니다 ... – Franz

3

그대로, Franz' solution은 작동하지 않습니다. 동일한 언어를 사용하는 prople의 트리플을 반환하지만 이러한 트리플은 중복을 포함 할 수 있습니다. 따라서, 여전히 예를 들어, sort/2length/2이 원래의 질문에 대한 답 찾기 :

?- findspeakers(Language, X1, X2, X3), sort([X1, X2, X3], Y), length(Y, 3). 
false. 

을 (그래서 대답은 없는이며, 같은 언어로 이야기에는 세 사람이 없다.) 어쨌든, 나는 더 우아한 해결책이 있는지 생각 :

spoken(L, S) :- 
    speaks(S, LL), member(L, LL). 

same_language(N, L, SS) :- 
    bagof(S, spoken(L, S), SS), length(SS, N). 

술어 spoken/2member/2를 사용하고 언어 L이 사람 S들이 사용하면 성공합니다. SSN 개의 별개의 사람이 포함되어 있고 모두가 L 인 경우 same_language/3이 성공합니다. 이 술어는 bagof/3을 사용합니다. speak/2 술어의 정의에 중복 데이터가 들어 있으면 대신 setof/3을 사용해야합니다.

이 멋지게 문제를 일반화된다 있음을 관찰 : 우리가 지금 단지 3. 데모, 어떤N에 대한 질문에 대답 할 수

?- same_language(3, L, SS). 
false. 

?- same_language(2, L, SS). 
L = dutch, 
SS = [fred, mary] ; 
L = english, 
SS = [fred, jim] ; 
false. 
+0

와우. 좋은 대답. 너의 것이 내 프롤로그 지식을 많이 초과한다;) – Franz

+0

그래, 내 것도. 나는'bagof'와'setof'가 어떻게 작동하는지 배우는 의미였습니다. 이것은 좋은 예제입니다. – bcat