2014-09-28 6 views
0

([], C, C)를 추가하려고합니다. 여기서 C는 몇 가지 요소를 포함하는 목록입니다. 가능한가? 나는 다른 조건이 참이라면 원소 append (Found, C, C)를 포함하는 C의 일부 목록을 추가 할 것이다. 또한 C의 최종 값을 변수 D에 저장하려고합니다. 어떻게해야합니까?프롤로그의 변수에 하나의 목록을 할당하는 방법은 무엇입니까?

+1

Uhhh ... 통합? – Mephy

+2

'append ([], C, C)'는'[]'의 끝에 추가 된 *'C '는'C' *라고 말합니다.'C'가 어떤 목록이라면 항상 참입니다. 그래서 당신이 무엇을 요구하고 있는지 약간 불분명합니다. – lurker

답변

1

([], 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].

도움이 되었기를 바랍니다.

관련 문제