2016-07-15 3 views
1

Prolog (SWI-Prolog)로 시작하기로 결정했습니다. 나는 프로그램을 작성 했으므로 이제는 간단한 주 술어를 작성하여 .exe를 작성하고 명령 행에서 프로그램을 실행할 수 있습니다. 그렇게하면 프롤로그 GUI가 아닌 명령 줄에서 참/거짓 관계를 찾을 수 있습니다. 그러나, 나는 주된 술어에 실제로 들어가는 것을 이해하는 데 어려움을 겪고있다.프롤로그의 간단한 주 술어 예제

mother(tim, anna). 
mother(anna, fanny). 
mother(daniel, fanny). 
mother(celine, gertrude). 
father(tim, bernd). 
father(anna, ephraim). 
father(daniel, ephraim). 
father(celine, daniel). 

parent(X,Y) :- mother(X,Y). 
parent(X,Y) :- father(X,Y). 
ancestor(X, Y) :- parent(X, Y). 
ancestor(X, Y) :- parent(X, Z), ancestor(Z, Y). 

의 첫 번째 시도 : 여기에 지금까지 프로그램입니다
내가 family_func() 그 때는라는 술어의 관계 정의를 모두 넣어, 나는이 main을 입력하여 주에서 해당 함수를 호출했습니다. 명령 줄에.

family_func():- 
    mother(tim, anna). 
    ... 

    parent(X,Y) :- mother(X,Y). 
    ... 

main:- 
    family_func(). 

두 번째 시도 : 나는 술어를 생성, 대신 프로그램이 오류를 시작하기 전에 내가했던 것처럼 관계를 찾기 시작 할 수있을 것으로 예상 : 코드 여기

ERROR: c:/.../ancestor.pl:18:0: Syntax error: Operator expected 

입니다 :
주 정의에 모든 정의를 넣으려고했습니다. 나는 main을 입력 할 수있을 것으로 예상했다. 그런 다음 프로그램을 일시 중지하고 절 입력을 시작할 때까지 기다리십시오 (Java를 실행하는 곳에서 프로그램을 실행하고 사용자 입력을 대기하는 것과 거의 같습니다). 대신 main을 입력하면 false가 반환됩니다.

질문 1 : 나는 자바 코드를 작성하는 데 사용하고
. 그래서, 내 마음에, 내가 시도한 첫 번째 일을해야합니다. 기본적으로 로컬 변수를 family_func()에 정의한 다음 해당 변수 간의 관계를 찾아야하는 더 작은 '메소드'(예 : parent(X,Y) :- mother(X,Y).)를 호출했습니다. 내가 main을 호출 할 때, 적어도, 나는 프로그램이 관계에 들어가서 결과를 반환하고 닫을 때까지 기다릴 것이라고 기대했을 것이다. 왜이 기능이 작동하지 않습니까?

질문 2 :
가 어떻게 실제로 주요 술어를 작성합니다? 이와 같은 프로그램에 대한 좋은 예가 있습니까? 예 : here을 시도했지만 작동하지 못했습니다.

도움 주셔서 감사합니다.

편집 :
새로운 시도 - 거짓 main. 반환하고, 바로 그것이 사실이어야한다하더라도 main. false를 반환 실행 한 후 parent(tim, anna).를 실행.

:- dynamic mother/2. 
:- dynamic father/2. 

family_func:- 
    assert(mother(tim, anna)). 
    assert(father(tim, bernd)). 

parent(X,Y) :- mother(X,Y). 
parent(X,Y) :- father(X,Y). 
ancestor(X, Y) :- parent(X, Y). 
ancestor(X, Y) :- parent(X, Z), ancestor(Z, Y). 

main:- 
    family_func. 

편집 : 다른 사람이 알 필요가
그냥 경우
는 대답 아래 코멘트에 @CapelliC 상태로, 호출 사이에 쉼표가있을 필요가있다.

family_func:- 
    assert(mother(tim, anna)), 
    assert(mother(anna, fanny)), 
    assert(mother(daniel, fanny)), 
    assert(mother(celine, gertrude)), 
    assert(father(tim, bernd)), 
    assert(father(anna, ephraim)), 
    assert(father(daniel, ephraim)), 
    assert(father(celine, daniel)). 
+2

한 의견 : 예를 들어 mother_child/2','father_child/2'와'PARENT_OF/2 '의 사용을 고려 '각각의 주장이 무엇을 의미 하는지를 분명하게 나타 내기 위해서이다.이렇게하면 코드가 많이 ** 더 읽기 쉽고 ** 쉽게 당신과 다른 사람들을 생각할 수 있습니다. 구문 오류는 한 술어의 정의를 다른 술어의 안에 포함하려고 시도 할 때 발생하며 가능하지는 않습니다. – mat

답변

2

내가 (빈 인수 목록이 허용되지 않습니다)해야한다고 생각 이름 지정에 대한

:- dynamic mother/2. 
... other dynamically defined relations... 

family_func:- 
    assert(mother(tim, anna)). 
    ... 

% rules can be dynamic as well, it depends on your application flow... 
parent(X,Y) :- mother(X,Y). 
    ... 

main:- 
    family_func. 
+0

안녕하세요. 답장을 보내 주셔서 감사합니다. 메인을 실행하면 실행중인 명령을 실행하는 데 여전히 문제가 있습니다. main.을 호출하면 false를 인쇄합니다. 그런 다음 부모 (팀, 애나)를 실행하려고하면 메인 후. 오류 : 부모/2 : 정의되지 않은 프로 시저 : 어머니/2 예외 : (8) 어머니 (팀, 안 나)? – JustBlossom

+0

': - dynamic mother/2.' 선언을 잊어 버리셨습니까? – CapelliC

+0

오류가있는 버전에서 나는 방금 설명했다. 왜냐하면 내가 동적 인 것을 사용할 때 모든 것이 거짓으로 돌아 왔기 때문입니다. 내가 편집 한 내용을 내 질문에 넣었습니다. – JustBlossom