如何在Prolog查询shell中使用变量?

如何在Prolog查询shell中使用变量?,prolog,swi-prolog,declarative,prolog-toplevel,Prolog,Swi Prolog,Declarative,Prolog Toplevel,我知道我可以在Prolog shell中使用变量(我想类似于使用“$”字符……但我不记得了……) 如果我执行以下查询,它似乎工作正常: ?- leggiFile('dataggare.txt', ListaTesto), tokenizzaLista(ListaTesto, TokenizedList, 1). ListaTesto = [68, 117, 114, 97, 110, 116, 101, 32, 105|...], TokenizedList = [t(1, [68, 117,

我知道我可以在Prolog shell中使用变量(我想类似于使用“$”字符……但我不记得了……)

如果我执行以下查询,它似乎工作正常:

?- 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
为什么??我觉得很奇怪。我缺少什么?

?-open('uty.pl',read,S)。
?- 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])).
...
S=(0x236d4d0)。 ?读($S,K)。 K=(:-module(uty、[atoi//2、缓存文件/2、缓存路径/4、调用路径/2、cat/2、计数解决方案/2、/…))。 ?读($S,K)。 K=(:-reexport(注意,[()/2,++/2,(**)/2])。 ...
但我不确定垃圾收集是否会干扰

成功执行顶级目标产生的绑定如果不太大,则在数据库中断言

?-open('uty.pl',read,S)。
S=(0x236d4d0)。
?读($S,K)。
K=(:-module(uty、[atoi//2、缓存文件/2、缓存路径/4、调用路径/2、cat/2、计数解决方案/2、/…))。
?读($S,K)。
K=(:-reexport(注意,[()/2,++/2,(**)/2])。
...
但我不确定垃圾收集是否会干扰

成功执行顶级目标产生的绑定如果不太大,则在数据库中断言


我改变了我的问题,因为我在原来的问题中犯了一系列错误。仍然不起作用,但现在我已经发布了真正的问题…对我来说似乎很奇怪,因为我认为我在Prolog Shell中使用了正确的语法来使用变量我认为你的变量太大了。也许这就是原因,因为ListaTesto包含txt文件的所有ASCII字符…我将尝试使用一个非常短的文件我已经更改了我的因为我在原来的问题中犯了一系列错误。仍然不起作用,但现在我已经发布了真正的问题…对我来说似乎很奇怪,因为我认为我在Prolog Shell中使用了正确的语法来使用变量。我认为您的变量太大。也许这就是原因,因为ListaTesto包含txt文件的所有ASCII字符…如果tokenizzaLista是DCG,我将尝试使用非常短的文件基于,您可以使用来自\u文件的短语\u否,这不是基于DCG的
$
不保证始终有效。它的目的是作为一个快速黑客(为用户)。正确的方法是简单地
asserta
将其以您选择的函子名称放入数据库中:例如
asserta(sym(name,Val))
,然后
sym(name,Val)
进行检索。如果tokenizzaLista是基于DCG的,您可以使用来自_fileno的短语_,这不是基于DCG的
$/code>不保证总是有效。它的目的是作为一个快速黑客(为用户)。正确的方法是简单地
asserta
以您选择的函子名称将其放入数据库中:例如
asserta(sym(name,Val))
然后
sym(name,Val)
进行检索。