그대로, Franz' solution은 작동하지 않습니다. 동일한 언어를 사용하는 prople의 트리플을 반환하지만 이러한 트리플은 중복을 포함 할 수 있습니다. 따라서, 여전히 예를 들어, sort/2
및 length/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/2
는 member/2
를 사용하고 언어 L
이 사람 S
들이 사용하면 성공합니다. SS
에 N
개의 별개의 사람이 포함되어 있고 모두가 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.
그것이 있어야하지 않나요'(프레드는 [독어 , 영어, 네덜란드]). (여분의 쉼표에 유의하십시오)? 또한 :이 숙제가 있습니까? 그렇다면 숙제로 표시하십시오. – Franz
그것에 약간의 냄새가 난다. – nedned