在StackExchange 上的这个问题中,我问过(并且已经解决)我一直在尝试创建的 Prolog 程序。但是,虽然它原则上有效,但它并不能满足我现实世界的需要。
在我开始学习另一种语言(Datalog)之前,我想尝试一下我已经完成的工作,并知道如何在 Prolog 中实现一种方法来记忆早期查询的结果,这样同一个查询只执行一次。因此,我正在寻找一种将成功查询的结果添加到 List 的方法,如果再次询问相同的查询,它不会重做计算,而是使用记住的结果。
我的主要问题是我找不到将成功查询的结果保存在“向上传递”的列表中的方法。
在
% get this out of the way, quickly
isARelation( Source, Relation, Target, _) :-
isADirectRelation( Source, Relation, Target).
% Structural Chains
isARelation( Source, Relation, Target, Visited) :-
\+ member( [Source,Relation,Target], Visited),
structuralOrDependencyRelation( RelationOne),
structuralOrDependencyRelation( RelationTwo),
weakest( Relation, RelationOne, RelationTwo),
isADirectRelation( Source, RelationOne, Intermediate),
isARelation( Intermediate, RelationTwo, Target, [[Source,RelationOne,Intermediate]|Visited]).
isARelation( Source, Relation, Target, Visited) :-
\+ member( [Source,Relation,Target], Visited),
structuralOrDependencyRelation( RelationOne),
structuralOrDependencyRelation( RelationTwo),
weakest( Relation, RelationOne, RelationTwo),
isADirectRelation( Source, RelationTwo, Intermediate),
isARelation( Intermediate, RelationOne, Target, [[Source,RelationTwo,Intermediate]|Visited]).
我如何实现第一次通话
isARelation(A, B, C, []).
计算结果,并进行第二次调用
isARelation(A, B, C, []).
使用较早发现的结果,该结果保持“全局”?