【发布时间】:2014-06-07 08:13:10
【问题描述】:
我有这样的功能:
myFunction(V1, V2, Result) :-
Result is V1/V1cover + V2/V2cover,
write(Result).
myFunction(0,0,0).
keepValue(V1,V2,V1cover,V2cover) :-
V1cover is V1,
V2cover is V2.
还有其他函数多次调用 myFunction 并返回 Result。但是,我想获得第一次调用 myFunction 的第一个结果,并保留它以供以后调用(在这种情况下,它是 V1cover 和 V2cover)。例如,第一次调用 myFunction(4,4,A)。然后它返回 A = 2。之后我想保留 V1cover(4) 和 V2cover(4) 的值以用于下一次调用。我怎么能这样做?我尝试应用缓存技术并将其应用到 myFunction:
:- dynamic(cachedGoal_sol/2).
reset :-
retractall(cachedGoal_sol(_, _)).
eq(A, B) :-
subsumes_term(A, B),
subsumes_term(B, A).
cached_call(Goal) :-
\+ (cachedGoal_sol(First,_), eq(First, Goal)),
copy_term(Goal, First),
catch(
( Goal,
assertz(cachedGoal_sol(First, Goal)),
fail
),
Pat,
(reset, throw(Pat))).
cached_call(Goal) :-
cachedGoal_sol(First, Results),
eq(First, Goal),
Results = Goal.
myFunction(V1, V2, Result) :-
**cached_call(keepValue(V1,V2,V1cover,V2cover),**
Result is V1/V1cover + V2/V2cover,
write(Result).
但它不起作用,当我尝试第二次运行 myFunction(2,3,A) 并跟踪程序时,它实际上存储了第一次调用的解决方案,但我无法获得 V1cover 的第一个值, V2cover 因为第二个 cached_call() 中的 eq() 失败。有没有办法只获取 V1cover、V2cover 的值而不触及 V1、V2,因为它们是输入的?非常感谢您的回答。
【问题讨论】:
-
那些不是函数,你不调用它们。您有想要满足的谓词和目标。