2011-12-25 30 views
7

Điều tôi hiện đang kiểm tra X (Y) không phải là sự kiện được chấp nhận trong DB nhỏ của tôi. Vì X (Y) trả về false, nó sẽ cố gắng xác nhận nó. (Tôi nhận ra điều này trình bày các vấn đề khi X là một quy luật và không phải là một thực tế)Tôi có thể sử dụng các biến với khẳng định/1 không?

ifNotAdd(X,Y):- 
    not(call(X,Y)), 
    !, 
    assert(X(Y)). 

Ví dụ, chúng ta hãy nói rằng thực tế này nằm ở cùng DB

mammal(dolphin). 

tôi hỏi ifNotAdd (động vật có vú, con voi).

Tôi muốn nó thấy điều đó? động vật có vú (voi). là sai và sau đó khẳng định động vật có vú (voi).

Rõ ràng là "xác nhận (X (Y))". dòng là sai, nhưng tôi phải thay thế nó bằng cách nào? Tôi đang tìm kiếm tài liệu prolog và diễn đàn cho câu trả lời nhưng không có may mắn cho đến nay. Tôi cũng đang cố viết một cái gì đó sẽ tự làm điều này.

EDIT Tôi cần chỉnh sửa DB để có cơ sở dữ liệu động mà người dùng có thể tương tác. Tôi đang xây dựng một máy đối số và tôi cần cho phép người dùng thông báo cho hệ thống rằng họ "biết thực tế chắc chắn" để hệ thống có thể xử lý kiến ​​thức bên ngoài miền của nó.

Trong bối cảnh của http://en.wikipedia.org/wiki/Reason_maintenance

Chúc mừng,

Trả lời

8

Bạn có thể sử dụng univ operator=../2 để xây dựng thuật ngữ trước khi khẳng định nó (lưu ý vị trong câu hỏi phải được khai báo động cho nó hoạt động):

ifNotAdd(X,Y):- 
    not(call(X,Y)), 
    !, 
    Term =.. [X, Y], 
    assert(Term). 

BTW nếu bạn muốn ifNotAdd/2 không thất bại khi nó không cần thêm sự kiện vào db, bạn nên quấn rằng trong một nếu cấu trúc, cộng, not/1 không được chấp nhận, (\+)/1 được ưu tiên:

:- dynamic(mammal/1). 

mammal(dolphin). 

ifNotAdd(X, Y):- 
    ( \+ call(X, Y) 
    -> Term =.. [X, Y], 
     assert(Term) 
    ; true). 

Nhưng tôi không chắc bạn đang cố gắng làm gì ở đó. Khá thường xuyên khi một người mới bắt đầu trong prolog muốn thao tác cơ sở dữ liệu đó là bởi vì một cơ chế prolog cụ thể không được hiểu đúng. Sau đó, một lần nữa bạn có thể không phải là một người mới bắt đầu và nhận xét của tôi có thể câm, trong trường hợp đó, chỉ cần quên nó! Nhưng nếu bạn là người mới bắt đầu, bạn có thể muốn chính xác những gì bạn đang cố gắng đạt được ở đây để chúng tôi có thể xác nhận rằng những thao tác đó là cần thiết!

+0

Ah hah, tôi thường sử dụng not() chỉ để dễ đọc khi hack nó cùng nhau lần đầu tiên mặc dù nó không được chấp nhận. Nên thay đổi điều đó cho bài đăng. Dù sao thì đó chính xác là những gì tôi đang tìm kiếm. Tôi đã không sử dụng prolog từ lớp tôi đã học nó trong một thời gian trước và đang học lại. Hoàn toàn quên '= ../2' để giải quyết điều đó. Tôi sẽ làm rõ chương trình ở trên. –

+0

về chỉnh sửa của bạn: có vẻ như một lý do hợp pháp để thao tác với db:] – m09

Các vấn đề liên quan