내가 원하는 것은 주어진 목록의 모든 요소 조합을 생성하는 것입니다. 예 : [a, b, c]에서, 내가 원할 수도 있습니다.clp (fd)로 모든 프롤로그 검색 조합을 묶는 방법은 무엇입니까?
[]
[a]
[b]
[c]
[a,a]
[a,b]
[a,c]
[b,a]
...
등등. 아마도 이것을 수행하는 마법의 프롤로그 원 라이너가있을 것입니다. 그렇다면, 나는 그것을 듣고 싶습니다.
그러나 내 질문은이 특정 문제를 해결하고 누군가가 Prolog의 검색 알고리즘의 미묘한 부분에 대해 설명해 주었다. 큰 순서로
members([], _).
members([X|Xs], List) :-
member(X,List),
members(Xs, List).
이 잘 작동하지만, 모든 가능한 결과를 반환하지 :
그래서 여기 내가 위의 문제를 해결하기 위해 먼저 한 일 없습니다
이[]
[a]
[a,a]
[a,a,a]
좋아, 더있어 문제. 난 단지 모든 조합을 특정 길이까지만 원해. 그래서 나는 정확히 특정 길이를 가진 것들을 먼저 얻기로 결정했습니다 :
membersWithLength(Members, List, Bound) :-
L = Bound,
length(Members, L), members(Members, List).
길이 2에 대한 :
[a,a]
[a,b]
[a,c]
...
등등. 이제 특정 길이까지의 모든 목록을 얻을 수 위의 기능을 활용할 수 clpfd를 사용하는 나의 시도는 비스듬히 갔다 : 작품의
:- use_module(library(clpfd)).
membersLessThan(Members, List, Bound) :-
L in 0..Bound, % I also tried L #=< Bound
membersWithLength(Members, List, L).
종류를. 올바른 결과를 찾습니다 (길이가 Bound보다 작은 목록). 그러나 발견 한 후에는 더 많은 결과를 지속적으로 검색합니다. 예 : 길이 2에 대한 :
[]
[a]
[b]
[c]
[a,a]
[a,b]
...
[c,c]
Hangs looking for more solutions.
나는 이것이 내 질문의 핵심이라고 생각한다. 왜 누군가는 (비록 그 흔적에 따라) 프롤로그가 모두 실패로 끝날지라도 더 큰 목록을 가능한 해결책으로 계속 점검 할 수있는 이유를 설명 할 수 있습니까? 그리고 프롤로그가이 운명의 여정을 피할 수있는 방법이 있는지 누군가가 말해 줄 수 있습니까?
궁극적으로이 문제를 해결하기 위해 다음 코드를 사용했지만 clpfd의 정수 제약 조건을 사용하여 목록의 크기를 제한하는 방법을 알지 못해서 실망했습니다.
length(L, _), members(L, [a,b,c]).
당신을 준다 : 당신은 당신이 할 수있는 모든 해답을 열거하려면, 당신과 함께 회원의 원래 구현 http://swish.swi-prolog.org/p/allcombos.pl
불행히도 clpfd와 용어는 잘 어울리지 않습니다. – false
http://stackoverflow.com/questions/32478193/using-a-constrained-variable-with-length-2/32501766 – jschimpf
나는 @false가 맞을 것이라고 생각합니다. 1) 그들이 무리를 짓지 않는 이유, 2) 그들이 어떤 상황에서 또는하지 않는지, 3) 전형적 대처 전략이 그렇지 않은 경우에 대해 설명 할 수있는 몇 가지 리소스를 가르쳐 주시겠습니까? ? 또는 이러한 개념을 잘 이해하면 나에게 설명해 주시면 고맙겠습니다. –