2013-10-17 32 views
0

我完全新的使用序言使用断言在序言与事实并不declerad

我想从f得到的结果,并把它放在一个新的事实,而不复制

f(1,2). 
f(1,3). 
f(1,10). 
f(9,1). 

get(X,M):- 
    (f(X,W);f(W,X)), 
    (not(fff(W)),not assert(fff(W)));fff(M) . 

它不是工作Unknown clause found fff(2) 但是当我试图把assert(fff(-1))在第一行上get工作,但它是不是最好的解决办法

谁能给我一个更好的方式来宣布fff

+1

什么FFF是什么?你只定义谓词'f'和'get'。 – seanmcl

+0

'fff'是一个动态的事实包含结果 – Steve

+0

* ...工作,但它不是最好的解决方案* - 你能定义你的意思是“最好的”? – lurker

回答

2

您的查询不是很清楚,因为MW都是自由变量。我承担的目标是一样的东西:

得到一M×使得f(X,M)或f(M,X),并memoise使用动态谓词fff的M的值。

假设我说对了,我的解决办法是:

:- dynamic(fff/1). 

f(1,2). 
f(1,3). 
f(1,10). 
f(9,1). 

get(X, W) :- 
    f(X, W), 
    assert_fff(W). 
get(X, W) :- 
    f(W, X), 
    assert_fff(W). 

assert_fff(W) :- 
    fff(W), 
    !. 
assert_fff(W) :- 
    asserta(fff(W)). 

输出:

Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 5.10.4) 
Copyright (c) 1990-2011 University of Amsterdam, VU Amsterdam 
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software, 
and you are welcome to redistribute it under certain conditions. 
Please visit http://www.swi-prolog.org for details. 

For help, use ?- help(Topic). or ?- apropos(Word). 

?- consult('test.pl'). 
% test.pl compiled 0.00 sec, 2,440 bytes 
true. 

?- listing(fff). 
:- dynamic fff/1. 

true. 

?- get(1, W). 
W = 2 ; 
W = 3 ; 
W = 10 ; 
W = 9. 

?- listing(fff). 
:- dynamic fff/1. 

fff(2). 
fff(3). 
fff(10). 
fff(9). 

true. 

?- 
+0

谢谢,但是当我reconsult得到这个消息'PIE语法错误在位置3:意外的标记:原子(“动态”)' – Steve

+0

我正在使用'序言推理引擎' – Steve

+0

Prolog的不同版本略有不同。上面的输出来自SWI Prolog。如果': - dynamic'指令在你的Prolog版本上不起作用,那就试试把它丢掉。如果这不起作用,请查看您的版本的文档以了解如何声明谓词是动态的。 –