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