경로 찾기 재귀가 Prolog에서 메모리 부족

존 Z

그리드에서 가능한 모든 경로를 찾기 위해이 프롤로그 프로그램을 작성했습니다.

travel([X,Y],[X,Y1]) :- Y1 is Y+1.
travel([X,Y],[X,Y0]) :- Y0 is Y-1.
travel([X,Y],[X1,Y]) :- X1 is X+1.

move([X,Y],n,[X,Y1]) :- travel([X,Y],[X,Y1]).
move([X,Y],s,[X,Y0]) :- travel([X,Y],[X,Y0]).
move([X,Y],e,[X1,Y]) :- travel([X,Y],[X1,Y]).

safe([Xn,Yn],[Xg,Yg]) :-
  Xg >= Xn,
  Xn >= 0,
  Yg >= Yn,
  Yn >= 0. %next state should be whit-in grid

%% solve([X,Y],[TargetX,TargetY],[Xg,Yg],[FirstMove|OtherMoves])

solve([X,Y],[X,Y],_,[]).
solve([X,Y],[Xt,Yt],[Xg,Yg],[Fm|Om]) :-
  move([X,Y],Fm,[Xn,Yn]),
  safe([Xn,Yn],[Xg,Yg]),
  solve([Xn,Yn],[Xt,Yt],[Xg,Yg],Om).

의 경우 solve[X, Y]는 현재 위치입니다. 그래서 내 종료 상태는 현재 위치가 목표 위치와 같을 때입니다. 그러나 실행하면 메모리 부족 오류가 발생했습니다. 내가 뭘 잘못했는지 알아? 도움을 주시면 감사하겠습니다!

?- solve([1,2],[4,2],[3,4],P).
ERROR: Stack limit (1.0Gb) exceeded
ERROR:   Stack sizes: local: 0.5Gb, global: 0.4Gb, trail: 29.0Mb
ERROR:   Stack depth: 951,746, last-call: 0%, Choice points: 1,903,475
ERROR:   Possible non-terminating recursion:
ERROR:     [951,746] user:solve([length:2], [length:2], [length:2], _114212638)
ERROR:     [951,745] user:solve([length:2], [length:2], [length:2], [length:1|_114212704])

?- length(P,4),solve([1,2],[4,2],[3,4],P).
false.

?- length(P,5),solve([1,2],[4,2],[3,4],P).
false.
라자 셰 카르

프로그램은 북쪽과 남쪽의 움직임 사이를 무한 반복합니다. 에서 남쪽 절을 제거하려고 move하고 travel그것은 작동합니다.

이것이 어떻게 발생하는지 디버깅하려면 trace재귀 호출을 사용 하여 확인하십시오 solve.

   Exit: (15) move([1, 3], n, [1, 4]) ? 
   Call: (15) safe([1, 4], [4, 4]) ? s
   Exit: (15) safe([1, 4], [4, 4]) ? 
   Call: (15) solve([1, 4], [3, 4], [4, 4], _3490) ? 
   Call: (16) move([1, 4], _3804, [_3822, _3828]) ? s
   Exit: (16) move([1, 4], n, [1, 5]) ? 
   Call: (16) safe([1, 5], [4, 4]) ? s
   Fail: (16) safe([1, 5], [4, 4]) ? 
   Redo: (16) move([1, 4], _3804, [_3822, _3828]) ? s
   Exit: (16) move([1, 4], s, [1, 3]) ? 
   Call: (16) safe([1, 3], [4, 4]) ? s
   Exit: (16) safe([1, 3], [4, 4]) ? 
   Call: (16) solve([1, 3], [3, 4], [4, 4], _3806) ? 
   Call: (17) move([1, 3], _4326, [_4344, _4350]) ? s
   Exit: (17) move([1, 3], n, [1, 4]) ? 
   Call: (17) safe([1, 4], [4, 4]) ? s
   Exit: (17) safe([1, 4], [4, 4]) ? 
   Call: (17) solve([1, 4], [3, 4], [4, 4], _4328) ? 
   Call: (18) move([1, 4], _4642, [_4660, _4666]) ? s
   Exit: (18) move([1, 4], n, [1, 5]) ? 
   Call: (18) safe([1, 5], [4, 4]) ? s
   Fail: (18) safe([1, 5], [4, 4]) ? 

또한에서 변수 이름과 일치하는 패턴으로 보이지만 move :- travel작동하지 않습니다. move(P1, n, P2)첫 번째 절만이 아닌 북쪽과 남쪽 절을 시도 move([2, 2], s, X)합니다 (첫 번째 해결책이 북쪽 운동임을 확인하십시오). 이것은 작동하지만 south 절을 사용하면 무한 재귀를 갖게됩니다.

move([X,Y], n, [X,Y1]) :- Y1 is Y+1.
move([X,Y], s, [X,Y1]) :- Y1 is Y-1.
move([X,Y], e, [X1,Y]) :- X1 is X+1.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

0,1 매트릭스에서 재귀 경로 찾기 (및 가능한 모든 경로 저장) java

분류에서Dev

메모리가 부족한 Linux 서버

분류에서Dev

이진 트리에서 가장 긴 짝수 값 경로 찾기, 해당 경로의 반환 길이, 비 재귀

분류에서Dev

iOS에서 메모리 부족으로 Motion JPG 스트림 재생

분류에서Dev

크기 조정이 문제가되지 않는 경우에도 비트 맵 팩토리로 메모리 부족 오류 방지

분류에서Dev

iOS + Delphi : 메모리 부족 경고-TTexture에서 메모리 누수 가능성이 있습니까?

분류에서Dev

TextWrangler에서 .txt 파일 가져 오기-메모리 부족 오류 코드 : -108

분류에서Dev

Java에서 실제로 메모리 부족 예외가 발생하는 경우는 언제입니까?

분류에서Dev

Android 스튜디오 앱에서 임의로 메모리가 부족합니다.

분류에서Dev

재귀-노드 메모리 부족

분류에서Dev

재귀 파이썬 함수에서 "메모리 부족"오류 방지

분류에서Dev

PHP 메모리 부족 변경 메모리 크기가 도움이되지 않습니다.

분류에서Dev

postgres에서 재귀 경로 찾기

분류에서Dev

재귀 메서드의 NullPointer (일반 트리 경로 가져 오기)

분류에서Dev

재귀 List <T>에서 자신의 부모에 재귀 적으로 값 추가

분류에서Dev

JS 재귀 적으로 부모-자식 배열에서 요소 찾기

분류에서Dev

BitmapImage로 메모리 부족

분류에서Dev

심층 신경망에서 메모리 부족

분류에서Dev

URL에서 ViewPager로 이미지로드-메모리 부족

분류에서Dev

SQL Server 2008 R2에서 프로그램을 계속 실행하기위한 메모리가 부족합니다.

분류에서Dev

Sparse에서 Dense로 변환 할 때 CountVectorizer의 메모리 부족

분류에서Dev

WAMP에서 400MB로 JMeter 메모리 부족

분류에서Dev

덩어리로도 메모리가 부족한 Dask

분류에서Dev

Universal Image Loader가 삼성 장치에서 메모리 부족

분류에서Dev

Linux가 메모리 부족 여부를 묻지 않고 내 프로세스를 죽이기 시작할까요?

분류에서Dev

범위보기로 인해 스칼라에서 메모리 부족 오류 발생

분류에서Dev

SSL 및 libcurl 초기화 및 "메모리 부족"가져 오기

분류에서Dev

파이썬에서 재귀를 통해 살아남는 목록에 문제가 있습니다. 그래프에서 가능한 모든 경로 찾기

분류에서Dev

Android에서 더 큰 파일을 업로드하는 동안 메모리 부족 오류가 표시됩니까?

Related 관련 기사

  1. 1

    0,1 매트릭스에서 재귀 경로 찾기 (및 가능한 모든 경로 저장) java

  2. 2

    메모리가 부족한 Linux 서버

  3. 3

    이진 트리에서 가장 긴 짝수 값 경로 찾기, 해당 경로의 반환 길이, 비 재귀

  4. 4

    iOS에서 메모리 부족으로 Motion JPG 스트림 재생

  5. 5

    크기 조정이 문제가되지 않는 경우에도 비트 맵 팩토리로 메모리 부족 오류 방지

  6. 6

    iOS + Delphi : 메모리 부족 경고-TTexture에서 메모리 누수 가능성이 있습니까?

  7. 7

    TextWrangler에서 .txt 파일 가져 오기-메모리 부족 오류 코드 : -108

  8. 8

    Java에서 실제로 메모리 부족 예외가 발생하는 경우는 언제입니까?

  9. 9

    Android 스튜디오 앱에서 임의로 메모리가 부족합니다.

  10. 10

    재귀-노드 메모리 부족

  11. 11

    재귀 파이썬 함수에서 "메모리 부족"오류 방지

  12. 12

    PHP 메모리 부족 변경 메모리 크기가 도움이되지 않습니다.

  13. 13

    postgres에서 재귀 경로 찾기

  14. 14

    재귀 메서드의 NullPointer (일반 트리 경로 가져 오기)

  15. 15

    재귀 List <T>에서 자신의 부모에 재귀 적으로 값 추가

  16. 16

    JS 재귀 적으로 부모-자식 배열에서 요소 찾기

  17. 17

    BitmapImage로 메모리 부족

  18. 18

    심층 신경망에서 메모리 부족

  19. 19

    URL에서 ViewPager로 이미지로드-메모리 부족

  20. 20

    SQL Server 2008 R2에서 프로그램을 계속 실행하기위한 메모리가 부족합니다.

  21. 21

    Sparse에서 Dense로 변환 할 때 CountVectorizer의 메모리 부족

  22. 22

    WAMP에서 400MB로 JMeter 메모리 부족

  23. 23

    덩어리로도 메모리가 부족한 Dask

  24. 24

    Universal Image Loader가 삼성 장치에서 메모리 부족

  25. 25

    Linux가 메모리 부족 여부를 묻지 않고 내 프로세스를 죽이기 시작할까요?

  26. 26

    범위보기로 인해 스칼라에서 메모리 부족 오류 발생

  27. 27

    SSL 및 libcurl 초기화 및 "메모리 부족"가져 오기

  28. 28

    파이썬에서 재귀를 통해 살아남는 목록에 문제가 있습니다. 그래프에서 가능한 모든 경로 찾기

  29. 29

    Android에서 더 큰 파일을 업로드하는 동안 메모리 부족 오류가 표시됩니까?

뜨겁다태그

보관