2014-04-19 1 views
1

목록을 분리하기 위해 Prolog의 append와 length 술어를 처음 사용하려고합니다. 재귀적인 해결책이 필요합니다. 나는 Prolog에 처음 왔으며이 시동기 문제에 대한 도움을 원합니다! :)Functor로 목록 추가하기

가 여기에 예상되는 코드 출력 :

?- splits([1,2,3],S). 
S = [1]/[2, 3] ; 
S = [1, 2]/[3] ; 
false. 

그것은 목록을 소요하고 그것을 분할하지만,이 펑터 /과 구조를 만들어 그렇게이 지금까지 저를 혼란 것입니다 .. 나는 이것을 위해 append를 사용해야한다는 것을 알고 있지만 어떻게 그렇게 할 수 있을까? 목록의 꼬리가 빌 때까지

splits([H | T], S) :- 
    length(T, len), len > 0, 

그것은 작동 한 후 중지,하지만 난 꽤 APPEND 기능을 추가하는 방법을 알아낼 수 없거나 : 여기

지금까지 내 코드입니다 재귀 적으로 만드십시오 누군가 제게 조언을 해줄 수 있습니까? :)

답변

2

나는 당신이 말하기를 append/3을 분할 목록에 사용할 수 있다고 거의 생각하고 있습니다. 이것은 실제로 인스턴스화 (-,-,+)에서 append/3이 무엇입니까.

귀하의 질문에 나타나는 것처럼 보이는 유일한 추가 요구 사항은 분할 중 하나가 비어있는 경우를 제외하는 것입니다. 이는 \==/2을 사용하여 용어 간의 동등성을 검사하여 수행 할 수 있습니다.

이 다음 코드 결과 :

splits(List, X/Y):- 
    append(X, Y, List), 
    X \== [], 
    Y \== []. 

추신 : len는 프롤로그 변수하지만 원자되지 않기 때문에, 당신의 코드에서 len의 사용이 잘못된 것을 알 수 있습니다. 원자를 두 번째 인수 인 length/2에 건다면 형식 오류가 발생하고 len > 0의 산술 오류가 발생합니다 (단, len은 함수로 정의되지 않음). (두 관측은 SWI-Prolog와 관련이 있습니다.)

희망이 있습니다!

+0

여기에 큰 도움이되었습니다! 목록 연결 이해에 도움 주셔서 감사합니다 :) – user3290526

0

여기서 재귀 적 접근법이다

splits([A,B|T], [A]/[B|T]). 
splits([A|T], [A|R]/S) :- 
    splits(T, R/S). 

제 절 [A]/[B|T]에 적어도 2 개 개의 요소 ([A,B|T])으로리스트를 분할의 기본 케이스를 제공한다 (다만 첫 번째 요소를 분리한다).

두 번째 절에서는 이 인 경우 R/S이 균열이 T 인 경우를 말합니다. 따라서 다른 솔루션을 기본 케이스로 재귀 적으로 "생성"합니다. 첫 번째 목록에 두 개의 요소 만있는 경우 기본 사례가 성공하고 첫 번째 시도에서 재귀 사례에 대한 백 트랙이 실패합니다 (원하는 경우 -이 경우에 대한 솔루션 없음). 재귀 사례는 첫 번째 목록에는 세 개 이상의 요소가 있습니다 (A에 재귀 쿼리에 T이 적용됩니다).

| ?- splits([1], S). 

no 
| ?- splits([1,2], S). 

S = [1]/[2] ? ; 

no 
| ?- splits([1,2,3], S). 

S = [1]/[2,3] ? ; 

S = [1,2]/[3] ? ; 

no 

... 
관련 문제