【问题标题】:Rule dependency graph in PrologProlog 中的规则依赖图
【发布时间】:2010-11-18 21:31:49
【问题描述】:

假设我想在 Prolog 中为 Prolog 程序制作规则依赖图。比如下面这个程序

foo(X) :- bar(X, 0).
bar(A, B) :- quux(A), coox(B).
baz.

将导致以下结果为真(通过使用assert):

depends(foo, [bar]).
depends(bar, [quux, coox]).
depends(baz, []).

或者类似上面的东西,我可以很容易地用来制作图表。我一直在考虑的方法是将输入文件的行作为字符串读取并对其执行一些简单的搜索和替换,但这看起来像一个丑陋的、不像 Prolog 的 hack。还有其他利用 Prolog 元逻辑功能的选项吗?

【问题讨论】:

  • 由于 Prolog 允许基于参数数量的谓词名称重载,因此您最好使用 Name/NArgs 术语而不是简单名称。

标签: prolog


【解决方案1】:

无需将文件读取为(非结构化)字符串:Prolog 源文件是一系列有效的 Prolog 术语,您可以使用 (例如)阅读/1 并推理它们,就像你对任何其他术语一样。 (:-)/2 已经是预定义的运算符,然后您可以使用 Prolog 的内置元谓词(arg/3、functor/3、=../2 等)轻松检查子句。正如您所期望的那样,这会自动处理源级 cmets 等。

【讨论】:

  • 句法后续问题:我如何制定一个规则来接受输入作为依赖(foo :- bar, baz, X, Y)?按照我现在的方式,我必须将“foo :- bar, baz”部分包裹在括号中。
  • 是的,你当然必须把它写成depends((foo :- bar,baz), X, Y),否则(即在depends(foo :- bar, baz, X, Y ) ),原子“baz”是depends/4 的第二个参数,而不是它的第一个参数的一部分。但是,如果您从文件中读取子句,则不会出现此问题:考虑 ?- read(Clause)。如果您输入“foo :- bar, baz”。 (不带引号),从句自动统一到术语 (foo:-bar,baz),您可以继续使用 ?- ...、clause_dependencies(Clause, Ds)、assertz(clause_depends_on(Clause, Ds))。假设您已根据需要定义了 clause_dependencies/2。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-20
相关资源
最近更新 更多