2011-03-26 4 views
0

이 프롤로그 코드를 쳐다 보면서 두통을 겪고 있습니다. 끝내야 할 일로 머리를 감쌀 수없는 것 같습니다 ...프롤로그 규칙이 실패하면 규칙 시작 부분으로 돌아갑니다.

기본적으로 코드는 주어진 프로토콜을 위반하려고 시도하고 있습니다. 공격자가 알고 싶어하는 일부 비밀 데이터. 그래서 공격자는이 비밀을 얻기 위해 공격하려고합니다. 이렇게하려면 그는 프로토콜을 성공적으로 실행해야합니다.

successfulRun(Init_1,Init_2,Init_3,RespGet_1,RespGet_2,RespGet_3,Resp_1,Resp_2,Resp_3,XchdGet_1) 

Init, Resp 및 Xchd는 보낸 메시지의 이름입니다. 이 술어는 기본적으로 Init_X (X가 메시지 부분 임)가 전송되고 Init_X의 수신자가 RespGet_X를 응답으로 보내고 RespGet_X를 가로 채고 Resp_X를 보내고 Resp_X의 수신자가 XchdGet_X를 응답.

나는 완전한 실행을 가지고 있는데, 나는주의를 기울인다.

asserta(fullRun(Init_1,Init_2,Init_3,RespGet_1,RespGet_2,RespGet_3,Resp_1,Resp_2,Resp_3,XchdGet_1)) 

공격자가 성공적인 실행 후에 암호를 알고 있으면 비밀이 유출됩니다. 비밀이 유출되지 않으면 공격 중에 얻은 지식을 삭제해야합니다 (실제로는 상호 작용의 한 인스턴스를 두 번 공격 할 수 없기 때문에). 그런 다음 새로운 공격 시도가 시작됩니다.

공격이 성공하고 해당 암호가 유출 된 경우 공격자가 암호를 얻은 방법에 대한 정보가 기록됩니다. 문제가 시작되는

tryToAttack(Secret) :- 
    successfulRun(Init_1,Init_2,Init_3,RespGet_1,RespGet_2,RespGet_3,Resp_1,Resp_2,Resp_3,XchdGet_1), 
    asserta(fullRun(Init_1,Init_2,Init_3,RespGet_1,RespGet_2,RespGet_3,Resp_1,Resp_2,Resp_3,XchdGet_1)), 
    (
    (
     leaks(Secret),! 
    ); 
    (
     \+leaks(secret), 
     (
     deleteAttackKnowledge; 
     (
      tryToAttack(Secret), 
      true 
     ) 
    ) 
    ) 
), 
    writeAttackPattern(Secret,Init_1,Init_2,Init_3,RespGet_1,RespGet_2,RespGet_3,Resp_1,Resp_2,Resp_3,XchdGet_1). 

좋아는 여기 : 성공적으로 실행하는 동안 , 공격 지식이 추출됩니다. 이 지식은 사실로 주장됩니다! 그것이 끈기가 없다면 아무런 문제가 없을 것입니다. 그래서 대안으로 공격에 대한 지식을 끈질 기게 만들 수 없습니다.

실행이 성공적이지만 이미 완전히 실행 된 경우 마지막 실행과 처음부터 다른 실행을 다시하고 싶습니다. 또한 마지막 실행 중에 얻은 모든 공격 지식을 삭제하려고합니다.

내가 볼 수있는 문제가 : 나는 successfulRun의 끝에서

(
    fullRun(...), 
    deleteAttackKnowledge 
) 

를 넣어 경우, 프롤로그는 공격자가 자신의 메시지를 기반으로 초기화 또는 인공 호흡기, 다시 이동하려고 시도합니다. Prolog가 resp로 돌아 가면 새로운 실행은 respGet에서 공격 정보를 얻지 못합니다. 1.이 모든 공격 지식을 삭제하고 (1), 다른 실행을하고 이동, 이미 수행 된 경우이 실행이 이미 3. 수행 된 경우 2. 참조 실행 작업을 수행하는

나는 원한다.

successfulRun(Init_1,Init_2,Init_3,RespGet_1,RespGet_2,RespGet_3,Resp_1,Resp_2,Resp_3,XchdGet_1) :- 
    init(Init_1,Init_2,Init_3), 
    canBuild(Init_1), 
    canBuild(Init_2), 
    canBuild(Init_3), 
    respGet(RespGet_1,RespGet_2,RespGet_3,Init_1,Init_2,Init_3), 
    extractAttackKnowledge(RespGet_1), 
    extractAttackKnowledge(RespGet_2), 
    extractAttackKnowledge(RespGet_3), 
    resp(Resp_1,Resp_2,Resp_3), 
    canBuild(Resp_1), 
    canBuild(Resp_2), 
    canBuild(Resp_3), 
    xchdGet(XchdGet_1,Resp_1,Resp_2,Resp_3), 
    extractAttackKnowledge(XchdGet_1). 

successfulRun주의 사항

: 초기화, RESP : 공격자가 보내는 respGet, XchdGet : 상대방이 공격자 canBuild에서 메시지 후에 보내는 : 공격자가 자신의 지식에서 메시지 부분을 구축 할 수 있습니다 (지식 + 공격 지식 시작)? extractAttackKnowledge : 메시지 부분에서 새로운 공격 정보를 추출합니다.

미리 감사드립니다. Daniel W.

피씨 : 불명확 한 점이 있으면 언제든지 말씀해주십시오.

+0

이렇게 얻은 정보를 전역 적으로 선언해야합니까? 변수로이 정보를 전달하는 것이 너무 복잡할까요? – Raceimaztion

답변

0

실패한 시도에서 학습 된 정보를 제거하려면 retractall/1 술어를 사용할 수 있습니다.

예를 들어

:

deleteAttackKnowledge :- retractall(fullRun(_,_,_,_,_,_,_,_,_,_)). 

참고 : 당신은 (". - 동적 (fullRun/10)"라인 추가하여 코드의 상단을) fullRun/10 동적으로 선언하면, 그것을 통역사가보다 쉽게 ​​처리 할 수 ​​있습니다.

내가 지금까지하고있는 일을 완전히 이해하지 못하기 때문에 잠시 동안 내 대답을 남겨 두겠다. 도움이 될만한 것을 알아 내면 내가 돌아와서 다른 것을 추가하거나 대답하거나 그것에 관한 메시지를 보내십시오.

+0

정보를 주장하는 대신 변수에 저장하여이 문제를 해결했습니다. 도움을 주셔서 감사합니다, 이것은 문제도 해결했을 것입니다. – danowar

관련 문제