안녕하세요 초보자의 prolog고민에 대한 조언좀 부탁드리겠습니다. .
안녕하세요 prolog 수업을 듣고 있는 학생인데 다른 프로그램에 비해 prolog는 자료도 많지 않고 쉬운듯 하면서 정말 헷갈려서 조언을 구하고자 글 올립니다.
숙제는
심볼테이블 "class” 를 만드는건데 . 심볼테이블의 요소는 다음과 같습니다.
(Name, Category, Type, Value) 이렇게 4개고 심볼테이블 이름이 리스트에 들어가야 합니다.
다음과 같은 predicate가 필요 한데요.
1) add (현재SymbolTable, Name, Category, Type, Value, NewSymbolTable)
새로운 심볼테이블을 name, category, type, value로 만들어야 합니다. 근데 현재 심볼테이블의 Name 값이 새로 만들려는 Name값과 일치한다면 fail을 출력합니다.
2) entry (SymbolTable, Name, Category, Type, Value) - Name값에 연관된 category, type, value을 출력하는데 심볼 테이블에 이름이 없으면 fail을 출력합니다. ,
맞는지 모르겠는데
Symbol1((name1, category, type, var),(name2, category, type, var),.....)
Symbol2((name3, category, type, var),(name4, category, type, var),.....)
Symbol3((name5, category, type, var),(name6, category, type, var),.....)
이런 모양(의미상)으로 저장되고 name값을 찾아 나머지를 출력하라는 거 같은데...
프롤로그에서 어떻게 리스트에 이름을 부여하고 그걸 저장하고 다시 호출해 사용할수 있는지 모르겠습니다.
예를 들면
add([],a,b,c,d,[a,b,c,d]).
이런 predicate를 만들고
실행을
add([],a,b,c,d,Test1).
이라고 실행하면
Test1=[a,b,c,d]
yes
이렇게 출력이 되지만
Test1이라는 이름을 호출해서 무얼 할수 있는 predicate를 어떻게 만드는지 모르겠습니다.
add([Test1],q,w,e,r,[Test3]). 이런식으로 실행을 시키면 작동을 안합니다..ㅠㅠ
어디서 보니 이건 assignment 기호가 없기 때문에 Test1에 실질적으로 저장이 되지 않는다고 들었는데
그럼 구분을 어떻게 해야 할지 ...
아니면 애초에
entry([a,b,c,d],q,w,x,z) :- add([],a,b,c,d,[a,b,c,d]),not(a = q).
이런식으로 짜볼까 했는데 이것도 작동이 제대로 안되요.
append 같은걸 써봐야 하나 해도 어떻게 찾는것이고 어떻게 add를 해야할지 안풀리네요...
고수분들 제발 조언해주시고 이 불쌍한 중생을 구제해 주세요.
_
?- add([],a,b,c,d,Test1), add(Test1,q,w,e,r,Test3).
prolog는 논리 추론을 위한 구조라서, 대입 같은 것이 존재하지 않습니다. add([],a,b,c,d,Test1)는 Test1에 [a,b,c,d]를 대입하는 과정이 아니라 Test1에 어떤 값이 들어갈지를 추정하기 위한 질문입니다. 그래서 거꾸로 생각하면 add(X, a, b, c, d, [a,b,c,d])를 질문하면 X = []라는 답이 나오는 것이고요.
Test1을 이용해서 Test3을 추정하려면 두 질문을 묶어서 해야겠죠.
댓글 달기