2013-05-24 4 views
1

Prolog 쉘에서 변수를 사용할 수 있다는 것을 알고 있습니다. ('$'문자를 사용하는 것과 같은 것 같지만 ... 기억이 안납니다 ...)Prolog 쿼리 셸에서 변수를 사용하는 방법은 무엇입니까?

다음 쿼리를 실행하면 고급 :

?- leggiFile('dataggare.txt', ListaTesto), tokenizzaLista(ListaTesto, TokenizedList, 1). 
ListaTesto = [68, 117, 114, 97, 110, 116, 101, 32, 105|...], 
TokenizedList = [t(1, [68, 117, 114, 97, 110, 116, 101]), t(-1, [32]), t(2, [105, 108]), t(-1, [32]), t(3, [77, 101, 100|...]), t(-1, [44]), t(-1, [32]), t(4, [...|...]), t(..., ...)|...] 

을하지만 오류로 이동, 별도로 두 개의 쿼리 leggiFile/2tokenizzaLista/2을 실행 이런 식으로하려고하면 :

?- leggiFile('dataggare.txt', ListaTesto). 
ListaTesto = [68, 117, 114, 97, 110, 116, 101, 32, 105|...]. 

?- tokenizzaLista($ListaTesto, TokenizedList, 1). 
ERROR: variable `ListaTesto' does not exist 

왜? 그것은 나에게 매우 이상한 것처럼 보인다. 내가 뭘 놓치고 있니? tokenizzaLista가 DCG 기반으로하는 경우 아니, 이것은 아니다

+0

, 당신은 – CapelliC

+0

phrase_from_file 사용할 수 있습니다 DCG 기반 – AndreaNobili

+0

'$'은 항상 작동한다는 보장이 없습니다. 그것은 빠른 해킹 (사용자를위한)을위한 것입니다. 올바른 방법은 선택자의 이름으로 데이터베이스에 'asserta'하는 것입니다. 'asserta (sym (Name, Val))'그리고 나서'sym (Name, Val)'을 호출한다. –

답변

1
?- open('uty.pl',read,S). 
S = <stream>(0x236d4d0). 

?- read($S,K). 
K = (:-module(uty, [atoi//2, cache_file/2, cache_path/4, call_nth/2, cat/2, count_solutions/2, .../...|...])). 

?- read($S,K). 
K = (:-reexport(nb_uty, [ (<<)/2, (>>)/2, ++/2, (**)/2])). 
... 

하지만 가비지 컬렉션이 방해 할 수 있는지 확실하지 않습니다 ...

Documentation 상태

Bindings resulting from the successful execution of a top-level goal are asserted in a database if they are not too large.

+0

원래 질문에서 일련의 오류가 발생하여 질문을 변경했습니다. 여전히 작동하지 않지만 지금은 실제 문제를 게시했습니다 ... Prolog 쉘에서 변수를 사용하기 위해 올바른 구문을 사용하고 있다고 생각하기 때문에 이상하게 보입니다. – AndreaNobili

+1

변수가 너무 큽니다. – CapelliC

+0

아마도 이것이 ListaTesto가 txt 파일의 모든 ASCII 문자를 포함하고 있기 때문입니다 ... 아주 짧은 파일 – AndreaNobili