我是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)时,它都会从头开始重新创建列表。 有没有更好的方法,或者这是要走的路?
答案 0 :(得分:1)
您的编辑会回答问题,这通常是执行此操作的方法。
但是,如果您希望出于性能原因保存谓词的结果(即不必再次运行多个附加),则可以使用asserta/1
或assertz/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)
你的谓词运行正常。