문제

나는 Prolog를 처음 접했지만 이 간단한 명령에 막혔습니다.나는 오류없이 지식 기반을로드했으며 시도 할 때마다 주장하다 (그리고 심지어 돕다) 다음과 같은 메시지를받습니다.

uncaught exception: error(existence_error(procedure,assert/1),top_level/0)
{2}

내가 정확히 무엇을 놓치고 있는 걸까요?감사합니다.

도움이 되었습니까?

해결책

사용 assertz/1 또는 asserta/1 대신에.GNU-프롤로그는 제공하지 않습니다 assert/1 왜냐하면 오직 asserta/1 그리고 assertz/1 표준에 정의되어 있습니다.

그 동안 참고하세요 asserta/1 항상 하나의 명확한 해석 의미를 가지고 있었습니다 처음에 절을 추가하세요, 그 의미 assertz/1 "끝에 절 추가"는 절을 주장하기 전에 호출된 목표의 의미를 완전히 결정하지 못하기 때문에 해결하기가 더 어려웠습니다.

ISO-Prolog를 사용하면 이전에 호출된 목표 assertz/1 (하지만 또한 retract/1)는 영향을 받지 않은 상태로 유지됩니다.이는 다음과 같이 알려져 있습니다. 논리적 업데이트 보기.표준(ISO/IEC 13211-1:1995)을 인용하려면:

7.5.4 논리적 데이터베이스 업데이트

다음의 결과로 발생하는 데이터베이스의 모든 변경 사항
목표 실행(예를 들어,
하위 목표는 assertz/1 또는 retract/1) 영향을 미칠 것이다
나중에 실행이 시작되는 활성화만 가능합니다.그만큼
변경 사항은 현재 활성화에 영향을 미치지 않습니다.
처형되고 있습니다.

참고 — 따라서 데이터베이스는 실행 중에 고정됩니다.
목표, 그리고 술어를 정의하는 절의 목록은 다음과 같이 고정되어 있습니다.
실행 순간(7.7.7 e 참조).

DECsystem 10 Prolog에서 매뉴얼은 두 버전 사이에 큰 차이를 만들었습니다. assert/1 그리고 assertz/1.1978년 DECsystem 10 사용자 가이드의 다음 인용문에서 용어는 다음과 같습니다. 구현 정의 표준에서 다음과 같이 알려진 것만을 의미할 수 있습니다. 구현에 따라 다름 (본질적으로 정의되지 않음을 의미)

5.5 메타논리적

...

assert(C)

현재 인스턴스 C 절로 해석되어 추가됩니다.
현재 해석된 프로그램(새로운 개인 변수 포함)
인스턴스화되지 않은 변수를 대체합니다).신형의 입장
관련 절차 내의 절은 구현에 따라 정의됩니다.
C 변수가 아닌 인스턴스화되어야 합니다.

asserta(C)

좋다 assert(C), 단, 새 조항이 첫 번째 조항이 되는 경우는 제외됩니다.
해당 절차에 대한 조항.

assertz(C)

좋다 assert(C), 단, 새 조항이 마지막 조항이 된다는 점은 제외)
해당 절차에 대한 조항.

또한 오늘날에는 다음과 같은 시스템이 있습니다. assert/1 그리고 assertz/1 다르다.예: .

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top