는 방법을 확인하는 규칙이 있으면서 프롤로그 파일의 절 데이터베이스
-
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)
실패해야 합니다.
당신이 필요합니다 두 가지 조건자가 이: =../2
고 call/2
.를 사용하는 경우 SWI-프롤로그,전화 help(=..).
고 help(call)
에서 통역사의 명령을 액세스 설명서를 참조하십시오.
나는 희망지 않았을 망치고 지정한다.당신은 아직도 무엇을 찾아와는 부분적으로 인스턴스 조건자(그래서,같은 말 verify(father,[abraham,X]).
자신에,그러나 그것은 어렵지 않을 것입니다.
행운을 빕니다.