2011-01-10 91 views
6

Xin chào, tôi đang cố gắng chèn phần tử vào danh sách nhưng rất quan trọng từ chương trình của tôi là kết quả được lưu trữ trong danh sách gốc chứ không phải trong danh sách mới.
Bất kỳ mã nào tôi đã viết hoặc tìm thấy trên internet chỉ thành công nếu bạn tạo danh sách mới trong đó kết quả cuối cùng được giữ lại.
Vì vậy, câu hỏi của tôi là bất cứ ai có thể cho tôi biết làm thế nào để xác định một chức năng: chèn (X, L) trong đó X là một phần tử và L là một danh sách?chèn phần tử vào danh sách và trả về cùng một danh sách được cập nhật

+0

Nếu bạn cần cập nhật danh sách tại chỗ, thì bạn đang cố suy nghĩ quá mức. Bạn có thể mô tả vấn đề bạn đang cố giải quyết chi tiết hơn không? – Juliet

Trả lời

3

Không, Prolog không hoạt động theo cách đó. Không có thứ như "sửa đổi" một giá trị. Một biến có thể được thống nhất với một giá trị cụ thể, nhưng nếu nó đã là [1,3], nó sẽ không bao giờ là [1,2,3] sau đó.

2

Khi người dạy aschepler nói, bạn không thể thêm hoặc thực hiện bất kỳ thay đổi nào đối với danh sách thích hợp, tức là danh sách trong đó mọi phần tử đã bị ràng buộc. Chỉ có "sửa đổi" chúng ta có thể làm là thống nhất một biểu thức với một biểu thức khác.

Tuy nhiên, có một khái niệm về danh sách một phần mà các thành phần bổ sung có thể được "thêm" ở cuối. Điều này thường được gọi là danh sách khác biệt, mặc dù danh pháp đó có thể không dễ hiểu ngay lập tức.

Giả sử chúng ta bắt đầu, không phải với một danh sách trống, nhưng với một biến miễn phí X. Tuy nhiên, người ta có thể nghĩ rằng trừ X từ X và nhận được "không có gì". Đó là, một danh sách trống khác biệt được đại diện bởi X - X. Dấu trừ "-" ở đây là một toán tử thuần túy chính thức; không đánh giá sự khác biệt được dự định. Nó chỉ là một cú pháp thuận tiện như bạn thấy từ cách danh sách khác biệt có thể được sử dụng để thực hiện những gì bạn (có thể) muốn làm.

Chúng ta có thể thêm một yếu tố vào một danh sách khác biệt như sau:

insertDL(M,X-Y,X-Z) :- Y = [M|Z]. 

đây M là yếu tố mới, chúng tôi muốn thêm vào, XY là "cũ" danh sách khác biệt, và XZ là "mới" sự khác biệt (mà M đã được thêm vào, bằng cách hợp nhất biến Y miễn phí trước đó với danh sách một phần [M | Z], sao cho Z trở thành đuôi "mở" của danh sách một phần X).

Khi cuối cùng chúng tôi đã thực hiện chèn mọi thứ vào danh sách khác biệt, chúng tôi có thể biến X thành danh sách thích hợp bằng cách đặt "đuôi miễn phí" tại điểm đó thành danh sách trống []. Theo nghĩa này X là biến "giống nhau" như khi chúng ta lần đầu tiên bắt đầu, chỉ cần thống nhất bằng các bước gia tăng từ biến tự do đến danh sách thích hợp.

Đây là một kỹ thuật rất mạnh mẽ trong lập trình Prolog, và phải mất một số thực hành để cảm thấy thoải mái khi sử dụng nó. Một số liên kết để thảo luận thêm trên Web:

[Từ danh sách Prolog chênh lệch danh sách]
http://www.irisa.fr/prive/ridoux/ICLP91/node8.html

[Thực hiện sự khác biệt danh trong Prolog]
http://www.cl.cam.ac.uk/~jpw48/difflists.pdf

[Bài giảng Ghi chú: Danh sách Difference]
http://www.cs.cmu.edu/~fp/courses/lp/lectures/11-diff.pdf

1

Một số phần mở đầu cung cấp thuộc tính setarg/3 để sửa đổi các cụm từ trong địa điểm.

Để sử dụng nó trên danh sách, bạn chỉ cần phải xem xét rằng họ chỉ là một đại diện tốt đẹp của chuỗi từ ngữ hợp với functor '.'/2

Trong mọi trường hợp, khi bạn cần phải sử dụng setarg/3 trong Prolog, nó có thể có nghĩa là bạn đang làm điều gì sai.

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