2010-03-12 39 views
23

Tôi đã tự hỏi, tôi biết bạn có thể sử dụng assert để thêm sự kiện hoặc quy tắc hoặc bất cứ điều gì nếu bạn đã tuyên bố vị ngữ là -:dynamic, nhưng điều này chỉ cho phép thay đổi được thực hiện để được giữ trong đó chỉ phiên, vd nếu bạn đóng cửa sổ Prolog thì các thay đổi của cơ sở dữ liệu sẽ bị mất.Prolog - ASSERT và RETRACT

Vì vậy, tôi đã tự hỏi, có cách nào làm cho nó để các thuộc tính assertretract có thể thực hiện thay đổi vĩnh viễn đối với tệp Prolog .pl?

Cảm ơn

Trả lời

37

Tôi có thể đề xuất cho bạn một cách rất đơn giản để thực hiện việc này.

1 ?- assert(a(1)). 
true. 

2 ?- assert(a(2)). 
true. 

3 ?- assert(a(3)). 
true. 

4 ?- a(A). 
A = 1 ; 
A = 2 ; 
A = 3. 

5 ?- tell('a_db.txt'), listing(a), told. 
true. 

Sau đó đóng phiên, mở lại.

1 ?- a(A). 
ERROR: toplevel: Undefined procedure: a/1 (DWIM could not correct goal) 
2 ?- ['a_db.txt']. 
% a_db.txt compiled 0.00 sec, 516 bytes 
true. 

3 ?- a(A). 
A = 1 ; 
A = 2 ; 
A = 3. 

4 ?- listing(a). 
:- dynamic a/1. 

a(1). 
a(2). 
a(3). 

true. 
+2

cảm ơn, dường như hoạt động, tôi chỉ tự hỏi liệu có thể trỏ swi vào một thư mục cụ thể thay vì thư mục mặc định không? khi sử dụng lệnh tell tất nhiên, – KP65