2012-04-10 67 views
6

Tôi mới làm quen với lập trình prolog và đã được nói trong một hướng dẫn để xác định danh sách các cấu trúc (trong một tập lệnh) để tôi có thể truy vấn nó dưới dạng cơ sở dữ liệu. Tuy nhiên tôi thấy nó không thể xác định danh sách này như là một biến trong một kịch bản. Khi tôi định nghĩa một danh sách nhưXác định danh sách trong các tập lệnh prolog

X=[a,b,c]. 

tôi chỉ nhận được một lỗi nói

No permission to modify static_procedure `(=)/2' 

Liệu Prolog không hỗ trợ xác định các biến như thế này? Tôi đang sử dụng SWI-Prolog dưới Linux.

Trả lời

14

Trong Prolog chúng ta nói về logic biến, có nghĩa là sắc giữa literals.

Tức là, một chương trình là một tập hợp các quy tắc tập thể hiện sự thật về các chữ cái của chúng tôi và các chữ cái đó là uninterpreted. Chúng tôi viết các quy tắc sử dụng các biến số để mô tả quan hệ về cá nhân và trong khi cố gắng chứng minh xem truy vấn của chúng tôi có thể trở thành sự thật hay không, Prolog liên kết các biến số.

Một danh sách đó là đường chỉ cú pháp cho một mối quan hệ nhị phân giữa nhiệm kỳ (các đầu) và (lưu ý các đệ quy ở đây) một danh sách . Thông thường, khi chúng ta nói về một cơ sở dữ liệu , chúng ta sử dụng các sự kiện (các quy tắc không có thân thể, luôn đúng) liên kết các nguyên tử nguyên tử.

Vì vậy, hướng dẫn đó có thể diễn tả tác vụ bằng các từ khác với bạn báo cáo hoặc có phần gây nhầm lẫn.Bạn nào có thể lưu trữ danh sách trong cơ sở dữ liệu của bạn như vậy:

mylist([a,b,c]). 

và viết chương trình của bạn như:

myprog(X) :- mylist(L), member(X, L). 

Sau đó, bạn có thể truy vấn chương trình của bạn như:

?- myprog(X). 

và Prolog, cố gắng để chứng minh myprog/1, hãy cố gắng chứng minh danh sách của tôi/1 thành viên/2 ... Để chứng minh danh sách của tôi (X) biến số X bị ràng buộc với [a, b, c].

HTH

0

không, bạn không thể thực hiện việc này như thế này. những gì được về cơ bản bạn viết là:

=(X,[a,b,x]). 

và như lỗi nói rằng bạn không thể xác định lại =/2

những gì bạn có thể làm là:

x([a,b,c]). 

và khi bạn muốn sử dụng X:

... 
x(X), 
foo(X) 
... 
5

Khi bạn viết

X = [a, b, c]. 

Nó đọc như

=(X, [a, b, c]). 

được đọc như một định nghĩa về một thực tế liên quan đến việc =/2 vị. Một thực tế mà bất kỳ biến miễn phí nào sẽ bằng [a, b, c]. Tức là, bạn xác định lại =/2. Đó rõ ràng không phải là những gì bạn có ý định!

Bạn phải nhớ trong Prolog rằng các biến chỉ được phạm vi cục bộ, bên trong một biến vị ngữ. Điều gì sẽ làm việc là:

main :- 
    X = [a, b, c], 
    % do stuff with X. 
1

Tôi sử dụng swipl dưới linux, để xác định danh sách ở dạng prolog.

mylist([element1,element2,elementn]). 

Sau đó, bạn có thể truy vấn chương trình của bạn:

?- mylist(A). 
Các vấn đề liên quan