([], C, C)를 추가하려고합니다. 여기서 C는 몇 가지 요소를 포함하는 목록입니다. 가능한가? 나는 다른 조건이 참이라면 원소 append (Found, C, C)를 포함하는 C의 일부 목록을 추가 할 것이다. 또한 C의 최종 값을 변수 D에 저장하려고합니다. 어떻게해야합니까?프롤로그의 변수에 하나의 목록을 할당하는 방법은 무엇입니까?
답변
([], C, C)를 추가하고 싶습니다. C는 몇 가지 요소가 포함 된 목록입니다. 가능한가?
append([],C,C)
은 항상 true입니다. 빈 목록은 무엇이라도 결합되어 있습니다. 프롤로그 당신이 그것을 시도 할 때 말씀을 봐 : 어떤 바인딩없이
?- append([],C,C).
true.
이 true
는 프롤로그가 증거를 설립되지만 새 바인딩이 결과로 생성되지 않았 음을 알려줍니다. 이 코드의 결과는 다음과 같습니다.
meaningless(_, _, _).
?- meaningless(everybody, X, Squant).
true.
이는 사용자의 욕망이 잘못되었다는 것을 나타냅니다. append([], C, C)
당신이 생각하는대로하지 않습니다.
다른 조건이 참이면 append (Found, C, C) 요소를 포함하는 일부 목록을 추가 할 것입니다. 또한 C의 최종 값을 변수 D에 저장하려고합니다. 어떻게 할 수 있습니까?
가변적 인 상태를 암시하는 "저장"및 기타 조작을 생각하는 것은 사용자가 Prolog를 이해하지 못한다는 확실한 신호입니다. 프롤로그에서는 바인딩을 설정하거나 초보자를위한 타르 핏 (tar pit) 인 동적 저장소에 사실을 선언합니다. 이런 식으로 뭔가를 수행하여 프롤로그 방식으로 얻을 수있는 비슷한 : 원자 및 목록 :
frob(cat, List, Result) :- append([cat], List, Result).
frob(dog, List, List).
이 술어 frob/3
두에 - 매개 변수가 있습니다. 원자가 cat
인 경우 목록 시작 부분에 [cat]
이 추가됩니다. 절의 머리에있는 인수와 절의 본문에서 사용하는 스레드 사이의 스레드는 Prolog가 상태를 관리하는 방법입니다. 기본적으로 Prolog의 모든 상태는 호출 스택 또는 동적 저장소에 있습니다.
def fac(n):
result = 1
while n > 1:
result = result * n
n = n - 1
이 버전은 상태의 일종 변수, result
을 가지고 있습니다. 계산을 위해 반복적으로 상태를 루프로 변경합니다. 팩토리얼 함수는 fac (n) = n * fac (n-1)으로 정의 될 수 있지만이 구현에서는 fac (n-1)이 명시 적으로 코드에 숨어 있지 않습니다.
재귀 방법은 다음과 같습니다
def fac(n):
if n < 1:
return 1
else:
return n * fac(n-1)
가 명시 적으로 상태가 여기에, 그래서 어떻게 계산 작동합니까? 상태는 암시 적이며 스택에 포함됩니다. 프로 시저 프로그래머는 회귀시 회의적인 눈썹을 일으키는 경향이 있지만 Prolog에서는 assignable과 같은 것이 없으므로 첫 번째 방법을 사용할 수 없습니다.
frob/3
으로 돌아 가면 조건은 첫 번째 인수에 내포되어 있습니다.첫 번째 본문에서는 첫 번째 본문에서 세 번째 인수가 append/3
호출의 세 번째 인수에 바인딩되어 두 번째 인수 인 List
에 추가 된 원자의 목록 cat
과 통합되므로 동작이 본문에서 다릅니다. 두 번째 본문에서는 특별한 것이 일어나지 않고 세 번째 인수는 두 번째 인수와 동일한 값에 바인딩됩니다. 따라서 frob(Animal, List, Result)
으로 전화 할 경우 이 아닌 앞면에 cat
으로 바인딩됩니다 (Result
).
Prolog가 마지막 값을 반환 값으로 처리하고 있다고 생각하지 마십시오! 그게 사실이라면,이 확실히과 같이 작동하지 않을 것입니다 : 여기에 일어난 것으로 보인다 무엇
?- frob(X, Y, [whale]).
X = dog,
Y = [whale].
는 프롤로그 목록이 cat
로 시작하지 않았기 때문에 X가 dog
것을 추론 할 수 있었다고 말할 수 있다는 것입니다. 좋은 프롤로그 프로그래머는 API에서 그 환상을 유지하려고하지만, 실제로 여기에서 일어난 모든 것은 프롤로그가 append([cat], X, [whale])
으로 확장 된 첫 번째 규칙을 입력 한 다음 프롤로그가 X가 올 수 없기 때문에 실패했습니다. [cat]
이 앞에 붙어 있습니다. 그것은 [whale]
을 생성합니다. 결과적으로 두 번째 규칙은 X를 dog
으로 통합하고 두 번째 인수를 서로 통합합니다. 그러므로 Y = [whale]
.
도움이 되었기를 바랍니다.
- 1. 결과를 프롤로그의 변수에 저장 하시겠습니까?
- 2. 목록을 확장하는 동안 변수에 값을 할당하는 방법은 무엇입니까?
- 3. .NET에서 전역 변수에 메모리를 할당하는 방법은 무엇입니까?
- 4. 결과를 어떻게 프롤로그의 변수에 저장합니까?
- 5. 루프의 변수에 값을 할당하는 방법은 무엇입니까?
- 6. CLPFD에서 변수에 값을 할당하는 방법은 무엇입니까?
- 7. MATLAB에서 변수에 값을 할당하는 방법은 무엇입니까?
- 8. 버튼을 사용하여 변수에 값을 할당하는 방법은 무엇입니까?
- 9. Zsh/Shell - 변수에 조용히 할당하는 방법은 무엇입니까?
- 10. VB2010 lostfocus에서 변수에 값을 할당하는 방법은 무엇입니까?
- 11. 템플릿에서 변수에 값을 할당하는 방법은 무엇입니까?
- 12. 동적 변수에 dataframe을 파이썬에 할당하는 방법은 무엇입니까?
- 13. C#에서 변수에 트리거를 할당하는 방법은 무엇입니까?
- 14. 개체를 파이썬에서 변수에 재 할당하는 방법은 무엇입니까?
- 15. 파일 내용을 변수에 할당하는 방법은 무엇입니까?
- 16. 변수에 %% 매개 변수를 할당하는 방법은 무엇입니까?
- 17. 터미널 출력을 파이썬 변수에 할당하는 방법은 무엇입니까?
- 18. 모듈 이름을 변수에 할당하는 방법은 무엇입니까?
- 19. phonegap device.platform 값을 변수에 할당하는 방법은 무엇입니까?
- 20. 쉘 스크립트 변수에 출력을 할당하는 방법은 무엇입니까?
- 21. Makefile에서 변수에 값을 할당하는 방법은 무엇입니까?
- 22. maxima에서 solve의 결과를 변수에 할당하는 방법은 무엇입니까?
- 23. .bat의 변수에 chdir을 할당하는 방법은 무엇입니까?
- 24. 변수에 readAsDataURL() 값을 할당하는 방법은 무엇입니까?
- 25. 절단을 사용하여 변수에 값을 할당하는 방법은 무엇입니까?
- 26. 개체를 변수에 저장하지 않고 할당하는 방법은 무엇입니까?
- 27. 개체 함수를 변수에 할당하는 방법은 무엇입니까?
- 28. JavaScript에서 struts의 변수에 값을 할당하는 방법은 무엇입니까?
- 29. 클래스 인스턴스를 만들고이를 변수에 할당하는 방법은 무엇입니까?
- 30. 컬링 결과를 변수에 할당하는 방법은 무엇입니까?
Uhhh ... 통합? – Mephy
'append ([], C, C)'는'[]'의 끝에 추가 된 *'C '는'C' *라고 말합니다.'C'가 어떤 목록이라면 항상 참입니다. 그래서 당신이 무엇을 요구하고 있는지 약간 불분명합니다. – lurker