세 가지 다른 이름의 무작위 목록을 생성하는 술어 randomnames/1
을 작성하려고합니다.프롤로그에서 중복되지 않고 특정 길이의 무작위 목록을 만드는 방법은 무엇입니까?
random_names([A,B,C]) :-
random_name(A),
random_name(B),
random_name(C).
이 유일한 문제는 : 사람이 어떻게해야 제안,
name(1, Mary).
name(2, Pat).
name(3, James).
name(4, Bob).
name(5, Susan).
random_name(Name):-
random(0, 6, N),
name(N, Name).
이 목록의 내용 : 이름은 데이터베이스에있는 나는 이미 임의의 이름에 대한 조건이 생성 된 목록에서 중복을 얻을 수 있습니다. 나는 그 문제를 해결하는 방법을 알아낼 수 없다. 중복을 제거하기위한 새로운 술어를 작성할 수는 있지만, 복제본을 다른 변수로 대체하면 어떻게 목록에 여전히 세 가지 요소가 있습니까? 그리고 random_names
술어에 명확한 머리와 꼬리가 없을 때 어떻게 제거 술어를 작성합니까?
너무 감사 randseq/3이 목록에 남아있는 모든 생성받은 후 N. 1에서 범위의 모든 고유 한 임의의 숫자의 목록을 생성은 이름에 매핑 번호입니다 당신의 정교한 답변에 많이! 술어가 실패 할 수있는 이유는 실제로 중복이 발견되면'dif' 중 하나가 실패하고'three_distinct_elements'가 실패한 다음 전체 술어가 실패한다는 것입니다. 그게 맞습니까? –
네, 맞습니다! – mat
코드를 사용하여 실패하지 않는 답변을 하나만 얻을 수 있다고 생각하십니까? 이 술어가 다른 술어의 일부로 필요하기 때문에 쿼리에서'repeat '를 할 수 없습니다. 코드에'repeat'를 추가하면 많은 양의 후퇴 (backtracking) 결과를 얻을 수 있으며'컷 (cut) '을 추가하면'반복 (repeat)'을 무효화하는 것처럼 보입니다. 반복과 절단을 모두 할 수 있습니까? –