2009-12-03 141 views
5

我是Prolog的新手,迄今爲止我學習瞭如何在文件中定義謂詞並運行解釋器來使用它。但是我想知道是否有辦法在?提示符下定義謂詞,這樣我就不必來回切換。如何在序言中定義謂詞

我現在正在做的方式是這樣的

文件defs.pl:

adjacent(1,2). 
adjacent(1,3). 

在序言中解釋:

?- consult('defs.pl'). 
% defs.pl compiled 0.00 sec, 122 bytes 
true. 
?- adjacent(1,2). 
true. 

編輯 也許我的意思是如何定義'事實'我不確定。

回答

9

可以使用assert/1斷言:

?- assert(adjacent(1,4)). 
true 

編輯: 順便說一句,如果你試圖將其與一個文件中定義的謂詞結合起來,這將無法正常工作。 因此,要麼在文件中定義所有相鄰/ 2個謂詞,要在命令行中用assert定義它們。

如果你想定義一些文件中的謂詞,並與斷言別人的,然後在你的文件該謂語爲動態聲明:

% file contents 
:- dynamic(adjacent/2). 
adjacent(1,2). 
adjacent(1,3). 
4

你可以做

?- consult(user). 

?- [user]. 

並在此之後輸入子句,然後終止與文件結束的輸入ch字符(在Linux中爲Ctrl-D,在MS-Windows中爲Ctrl-Z)。這相當於讀取文件,請參閱the documentation of consult/1

assert/1和retract/1旨在用於由代碼動態更改的謂詞(即用於存儲全局數據),而不是用於正常編程。

+0

我同意這可能是他們設計的,但我沒有看到使用這些問題(因爲它們可用)來快速測試和學習序言。開銷不應該成爲問題。 儘管我認爲您的解決方案更清晰,但您還需要重新輸入您在添加更多內容時已定義的所有謂詞。 – catchmeifyoutry 2009-12-04 17:55:29