2013-10-17 62 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版本上不起作用,那就試試把它丟掉。如果這不起作用,請查看您的版本的文檔以瞭解如何聲明謂詞是動態的。 –