는 방법을 확인하는 규칙이 있으면서 프롤로그 파일의 절 데이터베이스

StackOverflow https://stackoverflow.com/questions/321974

  •  11-07-2019
  •  | 
  •  

문제

에서 일하고 있어요 대학에 할당 내가 어디인지 확인해야 합는 경우에 특정 절(으로 사실 또는 원칙적으로)에 존재하는 현재 절 데이터베이스입니다.

아이디어가 사용하는 규칙을 누구의 머리인(+이름,+arguments).이 규칙이 충족해야 하는 경우에 데이터베이스에 존재하는 다른 규칙을 그 머리에 이름(인자)

어떤 도움이 될 것입니다.

도움이 되었습니까?

해결책

사용 call/1 좋은 생각이 아닙니다 call/1 실제로 목표를 부르지 만 사실/규칙이 있는지 확인하고 싶습니다. 존재합니다, 그리고 당신은 전화가 트리거 될 수있는 긴 계산 후 기다리지 않기를 원하지 않으며, 전화 규칙이 전화를 걸면 화면에 무언가를 인쇄하고 싶지 않습니다. writeln/1. 또한 원할 것입니다 verify/2 전화가 실패하더라도 성공하기 위해 (그러나 사실/규칙은 그렇지 않으면).

솔루션으로 SWI-PROLOG는 제공합니다 callable/1

callable(+Term)

True if Term is bound to an atom or a compound term,
so it can be handed without type-error to call/1, functor/3 and =../2.

다음은 두 가지 버전입니다 verify/2, 하나를 사용합니다 call/1 그리고 다른 하나는 사용합니다 callable/1.

verify1(Name, Arguments) :-
    Term =.. [Name | Arguments],
    call(Term).

verify2(Name, Arguments) :-
    Term =.. [Name | Arguments],
    callable(Term).

father(abraham, isaac) :-
    writeln('hello').

father(abraham, adam) :-
    fail.

다른 팁

당신은 당신의 개념에 익숙 통?당신이해야 할 것입니다:다만 전화를 조건자처럼 보이는 한 당신은 노력하고 찾을 수 있습니다.

그래서 말한 데이터베이스에서는:

father(abraham,isaac).

지금 당신이 전화를 원하는 무언가 다음과 같:

verify(father,[abraham,isaac]).

당신의 조건자 몸은 다음을 포함한 메커니즘의 부름 father(abraham,isaac). 는 다음 반환 true. 전화 father(abraham,adam) 실패해야 합니다.

당신이 필요합니다 두 가지 조건자가 이: =../2call/2.를 사용하는 경우 SWI-프롤로그,전화 help(=..).help(call) 에서 통역사의 명령을 액세스 설명서를 참조하십시오.

나는 희망지 않았을 망치고 지정한다.당신은 아직도 무엇을 찾아와는 부분적으로 인스턴스 조건자(그래서,같은 말 verify(father,[abraham,X]). 자신에,그러나 그것은 어렵지 않을 것입니다.

행운을 빕니다.

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