【问题标题】:How to use variables in Prolog query shell?如何在 Prolog 查询 shell 中使用变量?
【发布时间】:2013-05-24 15:19:45
【问题描述】:

我知道我可以在 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

为什么?在我看来很奇怪。我错过了什么?

【问题讨论】:

  • 如果 tokenizzaLista 是基于 DCG 的,你可以使用 phrase_from_file
  • 不,这不是基于 DCG 的
  • $ 不保证始终有效。它旨在作为一种快速破解(针对用户)。正确的方法是简单地将asserta 以您选择的函子名称放入数据库中:例如asserta( sym(Name,Val) ) 然后sym(Name,Val) 进行检索。

标签: prolog swi-prolog declarative prolog-toplevel


【解决方案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 状态

成功执行顶级目标所产生的绑定如果不是太大,则会在数据库中声明。

【讨论】:

  • 我已经更改了我的问题,因为我在原来的问题中犯了一系列错误。仍然不起作用,但现在我已经发布了真正的问题......在我看来这很奇怪,因为我认为我使用正确的语法在 Prolog shell 中使用变量
  • 我觉得你的变量太大了。
  • 也许这就是原因,因为 ListaTesto 包含 txt 文件的所有 ASCII 字符...我会尝试使用非常短的文件
猜你喜欢
  • 2021-03-09
  • 2019-06-08
  • 2019-04-11
  • 1970-01-01
  • 1970-01-01
  • 2018-02-21
  • 1970-01-01
  • 1970-01-01
  • 2019-08-28
相关资源
最近更新 更多