2012-06-14 1 views
2

필자는 모든 문자열에서 특정 길이의 무차별 검색을 수행하는 프롤로그 프로그램을 가지고 있습니다. 어떤 문자열이 특정 패턴과 일치하는지 확인하고, 모든 문자열을 포함하는 패턴 집합을 찾을 때까지 패턴을 계속 유지합니다. 어느 패턴이든 내 패턴과 일치하지 않는 파일에 저장하고 싶습니다. 따라서 새로운 패턴을 추가 할 때 전체 무차별 강제 검색을 다시 수행하는 대신 남은 부분 만 확인하면됩니다.SWI Prolog에서 파이썬 피클 링과 동등한가?

파이썬으로 작성한 경우 문자열 목록을 피클 링하여 파일에서로드합니다. 아무도 Prolog에서 비슷한 것을하는 법을 알고 있습니까?

나는 Prolog 프로그래밍 경험이 많지만 Prolog IO는 거의 없다. 아마도 파일을 읽고 용어로 구문 분석 할 술어를 작성할 수 있지만 더 쉽게 할 수있는 방법이있을 것이라고 생각했습니다.

답변

2

writeqread 유사한 작업을하지만, 선언 한 경우 연산자에 대한 writeq에 대한 참고 사항을 읽으십시오.

2

Prolog 용어를 읽으려면 read/1을 사용하십시오. 더 복잡하거나 다른 종류의 구문 분석을 위해서는 DCG를 사용하고 SWI의 라이브러리 (pio)와 함께 phrase_from_file/2를 사용하는 것이 좋습니다.

4

변수를 제외하고 언제든지 용어를 쓰고 나중에 읽을 수있게하려면 ISO 내장형 write_canonical/1 또는 write_canonical/2을 사용하십시오. quite well supported by current systems입니다. writeq/1write/1도 자주 사용되지만 항상 그런 것은 아닙니다. writeq/1은 연산자 구문을 사용하므로 (매우 동일한 연산자로 다시 읽어야하므로) write/1은 따옴표를 사용하지 않습니다. 그래서 그들은 깨어날 때까지 "대부분의 시간"—으로 일합니다.

또는, write_term/2 또는 write_term/3에서 ISO 쓰기 - 옵션 [quoted(true), ignore_ops(true), numbervars(false)]를 사용할 수 있습니다. 변수의 이름을 유지하기 위해 variable_names/1과 같은 추가 옵션을 사용하려는 경우 이것은 흥미로울 것입니다.

기록 된 용어에는 끝에 마침표가 포함되지 않습니다. 그래서 마지막에 수동으로 공백과 마침표를 써야합니다. 공간은 그래픽 문자로 구성된 원자가 끝 부분의 마침표와 충돌하지 않도록하는 데 필요합니다. 원자를 쓰는 것을 생각하십시오 '---'--- .이 아니고 ---.이 아닌 것으로 써야합니다. 원자의 경우에만 공간을 쓸 수 있습니다. 또는 "접착제"가 붙지 않는 원자 .