使用多个附加构建Prolog(swipl)知识库

时间:2015-04-08 10:39:53

标签: prolog

我是Prolog的新手,我正在尝试创建一个包含多个附加列表的知识库。可能吗? 如果从命令行我写:

append([a,b],[c,d],L0), append(L0,[e,f],L1).

输出是:

L0 = [a, b, c, d],
L1 = [a, b, c, d, e, f].

如果我在.pl文件中写相同的代码,它会说:

Full stop in clause-body? Cannot redefine ,/2

有没有办法告诉Prolog应用附加,然后使用L1作为知识库?

编辑: 我找到了一种方法:

list(L1) :- append([a,b],[c,d],L0), append(L0, [e,f], L1).

但是这样,每当我调用list(L)时,它都会从头开始重新创建列表。 有没有更好的方法,或者这是要走的路?

2 个答案:

答案 0 :(得分:1)

您的编辑会回答问题,这通常是执行此操作的方法。

但是,如果您希望出于性能原因保存谓词的结果(即不必再次运行多个附加),则可以使用asserta/1assertz/1谓词。例如,假设您有一个主要谓词,并且您希望执行追加程序并将其保存在saved_list/1谓词中,您可以执行此操作:

main :- 
    append([a,b],[c,d],L0), 
    append(L0,[e,f],L1), 
    asserta(saved_list(L1)).

(如果你想玩它,你可以在命令行上试试这个)

现在,如果您稍后运行saved_list(X),X将与[a, b, c, d, e, f]统一,而无需运行附加内容。如果已在代码中的某处定义saved_list/1,则必须将其声明为as dynamic

但是,警告:通常不鼓励使用各种断言和撤消谓词,因为它们是副作用。如果使用不当,他们可能会使代码更难理解和推理,并可能导致细微的错误。

此外,动态谓词通常不像硬编码那样快(即将谓词硬编码为saved_list([a,b,c,d,e,f]).使得调用它比动态断言更快)。使用它来缓存值,这样你就不必反复计算它们(即基本上使用memoization)通常是可以的,但是如果可能的话仍然应该避免。

除非您要追加的列表巨大,否则我建议您使用您提供的解决方案。使用assert是一个不必要的boondoggle,除非执行附加需要很长时间。

答案 1 :(得分:0)

你想要什么?我不明白。

你的谓词运行正常。