GN⁺ 3시간전 | parent | ★ favorite | on: Pokémon으로 설명하는 Prolog 기초(unplannedobsolescence.com)
Lobste.rs 의견들
  • Prolog을 실제로 생산적으로 쓰는 사람이 있는지 궁금함. 업무든 개인 용도든 괜찮고, 지금까지는 이런 장난감 예제만 봤음

    • Prolog을 꽤 좋아하고, 아마 가장 널리 쓰이는 Prolog 언어 서버 구현을 만든 사람으로서, 자잘한 스크립팅에 많이 씀
      엄밀히는 운영 중인 Prolog 코드도 하나 이상 있는데, 내부 분석 대시보드가 그렇고, 예전에는 iOS 앱의 백엔드 서버도 Prolog로 작성했음. 그 과정에서 외부 서비스 없이 APNS 알림을 보내려고 Prolog용 HTTP/2 클라이언트 라이브러리도 만들게 됨
    • 만족스러운 답이 될지는 모르겠지만, 이 블로그 글을 쓴 뒤로는 예전 코드와 완전히 다른 축의 문제에서 Prolog을 꺼내 쓰게 됨
      Prolog 커뮤니티에는 웹 서버 같은 데 쓰는 걸 좋아하는 사람도 분명 있지만, 개인적으로는 다른 스킬 트리를 여는 느낌에 가까움. 예를 들어 어떤 문제에 맞춤 파서나 DSL이 잘 맞을지 더 잘 알아보게 됨
      이 글을 쓴 뒤 얻은 지식으로 IRS Fact Graph의 세금 로직 엔진 중 유용한 부분집합을 다시 구현했음. Prolog은 이 작업에 놀라울 정도로 잘 맞는데, 명령형 구현으로는 그냥 넘어가기 쉬운 문서화 안 된 구석을 드러내고 해결을 강제하기 때문임
      “실행” 부분은 아직 완성하지 못했지만, 파싱은 충분히 끝나서 꽤 괜찮은 문서 초안을 쓸 수 있었음. 큰 기능 하나인 날짜 산술이 빠져 있고, 그게 들어가면 따로 정리할 예정
      DCG를 쓰면 Prolog은 복잡한 구조화 텍스트 파싱에 훌륭함. 예전에는 awk로 감당 안 되면 Python이나 JS를 떠올렸지만, 이제는 구조와 규율이 필요한 곳에서 Prolog이 잘 맞음. 한 파일에 들어가는 복잡한 코드베이스를 쓰는 구식 느낌도 만족스럽고, APL처럼 지나치게 축약적이지도 않음
      예제 자체는 사소하지만 Pokémon 사례는 그렇지 않음. 사소해 보이는 예제 대부분도 우스울 만큼 복잡한 전투 메커니즘을 매우 철저히 구현한 코드가 이미 있어서 가능했음. 기존 도구가 하는 일 일부를 수행하는 Prolog 규칙 엔진을 만드는 데 관심이 있고 조금씩 시도도 했는데, 장점은 명령형 코드보다 깊이 우선 탐색으로 가능성을 더 쉽게 드러내고 유지보수하기 좋다는 데 있음
    • 프로그램 분석에 가끔 사용했음. 꽤 많은 도구가 Datalog로 프로그램 정보를 저장하고 그 위에 질의를 쓰게 해주는데, 가끔은 실제 SWI-Prolog를 제공하는 도구를 써서 백트래킹이나 함수를 활용함
    • 내 블로그는 Prolog로 생성되고, 소스 코드도 공개돼 있음
      Scryer Prolog 문서도 DocLog라고 부르는 Prolog 프로그램으로 생성됨. 이 프로그램들이 쓰는 라이브러리도 몇 개 만들었음. SWI Prolog도 자기 웹사이트, Swish라는 웹 IDE, ClioPatria 서버 등에서 SWI를 직접 씀
  • SQLite를 일종의 타입 안전 스프레드시트처럼 써서 정보를 정리해 본 적이 있음. 그 위에 CRUD 인터페이스가 전혀 없어도 가능했음
    다만 항상 가장 보기 좋은 언어는 아니었음. Datalog도 한동안 살펴봤지만, 대부분 구현체가 이 글처럼 손쉽게 정보를 기록하는 도구라기보다 더 큰 프로그램에 내장하는 용도로 보였음
    어쩌면 Prolog이 실제로 써야 할 도구일지도 모름

    • 외부 데이터베이스 형태의 Datalog로는 MangleDatomic이 있어서 맞을 수도 있지만 직접 써본 적은 없음
      Prolog은 Datalog의 상위집합이라 Datalog가 하는 일은 전부 할 수 있고 그 이상도 가능함. 다만 그 “이상”이 문제가 될 때가 있는데, 이제 튜링 완전 언어라 끝나지 않을 수 있고, 추론이 조금 더 어려워질 수 있으며, 안전하지 않은 방식으로 쓰일 수도 있음
      Datalog는 제약이 있는 덕분에 지름길을 쓸 수 있어서 성능도 더 나은 경우가 많음
      마지막으로 Prolog에서는 데이터가 코드와 같아서, 즉 동형 코드성이 있어서, 생성/수정/삭제 작업이 사실상 소스 코드를 바꾸는 일이 됨. 동적으로도 가능하긴 하지만 흐름이 매끄럽다고 기대하긴 어렵고, 파일과 로드된 프로그램 사이에 어느 정도 수동 동기화가 여전히 필요함
  • Prolog을 더 깊게 배워서 명령어 집합 질의에 써보고 싶음
    하지만 수량과 비트 수준으로 본 정수를 포함해 논리를 모델링하는 일은 꽤 어려움