2017-09-30 1 views
2

나는 세 가지 이름의 무작위 목록을 생성하기 위해 (중복 금지) 술어 randomnames/1을 작성해야하는이 연습을하고 있습니다. 나는 이미 10 이름을 가진 데이터베이스를 가지고 있고 그들은 모두 예를 들어, 숫자에 해당합니다프롤로그 - 특정 길이의 목록을 생성하는 방법?

randomname(Name) :- 
    random(0, 11, N), % generate random integer between 1 and 10. 
    name(N, Name). 

내 질문은 다음과 같습니다 : name(1, Mary). 내가 한 임의의 이름을 생성하는 술어를 쓴 내가 이것을 어떻게합니까 목록에? 그리고 정확히 3 가지 요소의 목록이 있습니까? 너무 많은 내장 기능을 사용하고 싶지 않습니다. length/2 괜찮을 것입니다. 나는 그것이 필요할지도 모른다라고 생각한다 :)

고맙습니다.

편집 : 먼저 3 개의 임의 번호 (이름이 나중에 나올 수 있음) 목록을 생성하려고합니다. 나는이 끔찍하게 틀린 작은 것을 썼다. :/2 술어로 이것을하는 방법을 안다; 사용자가 세 요소 (예 : numberlist(3,X).)가있는 목록을 원한다는 쿼리를 입력하면됩니다. 그러나 나는 코드에 적어 두는 방법을 알아낼 수 없다. 나는 항상 세 개의 숫자 목록을 원한다. 또한 내 목록을 생성하는 데 findall을 사용하려고 생각했지만 목록의 길이를 3 개의 임의 요소로 제한하는 방법을 다시 모릅니다.

+2

너무 많은 내장 기능이 얼마나 많이 있습니까? – lurker

+0

글쎄, 나는'랜덤'과'길이'와 기본'is' 등을 사용할 수 있다고 생각합니다. 그러나 운동이므로 절대적으로 필요한 경우를 제외하고는 내장형을 사용하지 않아야합니다. 당신은 builtins와 함께 길을 가지면, 나는 그것을보고 싶다! –

+0

오,'findall'과'bagof'도 가능합니다! –

답변

2

프롤로그 목록을 기술하는 것이 먼저 단일   소자처럼 보이는 방법을 설명하는 것이 유용하다.

예를 들어, 귀하의 경우에는 이미 random_name/1과 같은 술어가있는 것으로 보이며 설명하려는 목록의 단일 요소를 설명합니다. 그래서

는 것에 대해 등의 요소로 구성된 목록을 설명합니다 :이 세 가지 요소 목록을 설명

 
random_names([A,B,C]) :- 
     random_name(A), 
     random_name(B), 
     random_name(C). 

, 그리고 random_name/1 이러한 요소 각각 보유하고 있습니다.

+1

그것은 실제로 아주 좋은 해결책입니다! 나는 너무 복잡한 생각을 해왔다. 유일한 문제는 목록에 중복이있을 수 없으며 귀하의 접근 방식을 사용하여 프로그램하는 방법을 모르겠습니다. 아이디어가 있습니까? –

+1

나는 이것이 다른 질문에서 가장 잘 논의되어야한다고 생각한다. – mat

관련 문제