2010-11-18 111 views
3

假设我想在Prolog中为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的metalogical功能的选项?

+1

由于Prolog允许基于参数数目的谓词名重载,所以最好使用'Name/NArgs'而不是简单名称。 – 2010-11-19 15:04:17

回答

2

有没有必要读为(非结构化)的文件字符串:Prolog的源文件是有效的Prolog 方面的序列,你可以用(例如)阅读条款读/ 1和推理他们就像你对其他任何条款一样。 (: - )/ 2已经是预定义的操作符,然后您可以使用Prolog内置的metapredicates(arg/3,functor/3,= ../2等)轻松检查子句。这会自动照顾源代码级别的注释等,就像您期望的那样。

+1

句法后续问题:我如何制定一个规则来接受输入(foo: - bar,baz,X,Y)?我现在的方式是,我必须将“foo: - bar,baz”部分包装在parens中。 – Igor 2010-11-19 21:23:12

+1

是的,你当然必须把它写成依赖((foo: - bar,baz),X,Y),否则(即依赖于(foo: - bar,baz,X,Y)),原子“baz “是depends/4的第二个参数,而不是其第一个参数的一部分。但是,如果您从文件中读取子句,则不会出现此问题:考虑? - 读(条款)。如果你输入“foo: - bar,baz。” (不带引号),子句自动统一为术语(foo:-bar,baz),并且可以继续使用? - ,clause_dependencies(Clause,Ds),assertz(clause_depends_on(Clause,Ds))。假设您已根据需要定义了clause_dependencies/2。 – mat 2010-11-20 01:13:10