✨Prolog

Prolog

Prolog là một ngôn ngữ lập trình. Tên gọi Prolog được xuất phát từ cụm từ tiếng Pháp Programmation en logique, nghĩa là "lập trình theo lô gíc". Xuất hiện từ năm 1972 (do Alain Colmerauer và Robert Kowalski thiết kế), mục tiêu của Prolog là giúp người dùng mô tả lại bài toán trên ngôn ngữ của logic, dựa trên đó, máy tính sẽ tiến hành suy diễn tự động dựa vào những cơ chế suy diễn có sẵn (hợp nhất, quay lui và tìm kiếm theo chiều sâu) để tìm câu trả lời cho người dùng.

Prolog được sử dụng nhiều trong các ứng dụng của trí tuệ nhân tạo và ngôn ngữ học trong khoa học máy tính (đặc biệt là trong ngành xử lý ngôn ngữ tự nhiên vì đây là mục tiêu thiết kế ban đầu của nó). Cú pháp và ngữ nghĩa của Prolog đơn giản và sáng sủa, nó được người Nhật coi là một trong những nền tảng để xây dựng máy tính thế hệ thứ năm mà ở đó, thay vì phải mô tả cách giải quyết một bài toán trên máy tính, con người chỉ cần mô tả bài toán và máy tính sẽ hỗ trợ họ nốt phần còn lại.

Cú pháp

Một chương trình Prolog bao gồm các luật được biểu diễn dưới dạng mệnh đề Horn. Một mệnh đề Horn có dạng

Head:-Body.

Head là một vị từ logic, còn Body có thể là rỗng hoặc là một tập các vị từ logic. Ví dụ như sau:

chẵn(X):- X chia_dư 2 = 0.

Phần lớn các bộ dịch của các chương trình Prolog đều yêu cầu vị từ logic ở phần đầu của một mệnh đề Horn là một vị từ dương (không có dấu phủ định đi kèm), còn các vị từ trong phần Body có thể có dấu phủ định đi kèm. Chương trình logic mà không có sự xuất hiện của dấu phủ định đi kèm gọi là chương trình logic xác định, còn không thì được gọi là chương trình logic thường.

Dữ kiện

Dữ kiện là những mệnh đề Horn mà phần Body là rỗng. Kiểu mệnh đề này thường được sử dụng để mô tả các dự kiện của bài toán, ví dụ như việc khai báo "tôm" là một con mèo:

mèo(tôm).

Khoảng cách từ Hà Nội vào thành phố Hồ Chí Minh là khoảng 2000Km:

khoảng_cách(Hà_Nội,TP_Hồ_Chí_Minh,2000).

Luật

Phần còn lại của các mệnh đề trong một chương trình Prolog được gọi là luật. Nó thường thể hiện những phát biểu logic trong bài toán, ví dụ như nếu công tắc đèn bật thì đèn sáng:

đèn_sáng(X):- công_tắc_bật(X).

Toán tử ":-" được dịch thô là "nếu", trong logic thì nó đại diện cho toán tử suy ra "<-". Phát biểu trên được phát biểu dưới dạng văn xuôi là "Nếu công tắc của đèn X bật thì đèn X sẽ sáng". Tất nhiên, bạn có thể chưa thoả mãn với phát biểu này và bổ sung vào nó để có một phát biểu chặt chẽ hơn:

đèn_sáng(X):- công_tắc_bật(X), có_điện.

Dấu phẩy "," trong mệnh đề trên được dịch là toán tử "và"; biến trong Prolog được quy ước bắt đầu là một chữ cái hoa.

Ngữ nghĩa

Một chương trình logic có ngữ nghĩa của riêng nó. Ngữ nghĩa quyết định những kết luận "đúng" nào có thể rút ra được từ một chương trình Prolog. Ví dụ một chương trình Prolog gồm một dữ kiện:

mèo(tôm).

Khi đó, ta có thể rút ra duy nhất một dữ kiện đúng là "tôm là một con mèo". Trong một ứng dụng Prolog, bạn có thể hỏi một trong hai câu hỏi sau để có được trả lời đúng:

?- mèo(tôm). yes.

?- mèo(X). X = tôm; no.

Trong ví dụ trên, "no" có nghĩa là không còn câu trả lời nào nữa. Mọi câu hỏi khác đều cho trả lời là sai. Điều này có nghĩa là trong một chương trình Prolog, người ta sử dụng giả thiết thế giới đóng, mọi thứ bạn khai báo là đúng, nếu không thì nó là sai. Vì vậy trong ví dụ trên, khi bạn hỏi "mitu có phải là một con mèo hay không", bạn sẽ nhận được câu trả lời "no".

Với một chương trình Prolog xác định, ngữ nghĩa của nó được định nghĩa là một mô hình tối thiểu của nó.

Với một chương trình Prolog bình thường, có nhiều loại ngữ nghĩa được sử dụng như ngữ nghĩa đầy đủ, ngữ nghĩa tối thiểu, ngữ nghĩa hoàn chỉnh,...

Đa số các chương trình biên dịch Prolog phổ thông (SWI-Prolog, GNU-Prolog) sử dụng ngữ nghĩa đầy đủ mà đi kèm là thủ tục suy diễn SLDNF.

Ví dụ

Phần này trình bày một số chương trình ví dụ, nó có thể chạy tốt trong SWI-PROLOG.

QuickSort

split(H, [A|X], [A|Y], Z):- order(A, H), split(H, X, Y, Z). split(H, [A|X], Y, [A|Z]):- not(order(A, H)), split(H, X, Y, Z). split(_, [], [], []). quicksort([], X, X). quicksort([H|T], S, X):- split(H, T, A, B), quicksort(A, S, [H|Y]), quicksort(B, Y, X).

Tháp Hà Nội

hanoi(N):- move(N, left, centre, right). move(0, , , _):-!. move(N, A, B, C):- M is N-1, move(M, A, C, B), inform(A, B), move(M, C, B, A). inform(X, Y):- write([move, a, disc, from, the, X, pole, to, the, Y, pole]), nl.

Đại số

/ Tính đạo hàm / d(X,X,1):-!. / d x dx = 1 / d(C,X,0):- atomic(C). / d c dx = 0 / d(-U,X,-A):- d(U,X,A). / d -u dx = - d u dx /
d(U+V,X,A+B):- d(U,X,A), d(V,X,B). / d u+v dx = d u dx + d v dx / d(U-V,X,A-B):- d(U,X,A), d(V,X,B). / d u-v dx = d u dx - d v dx / d(CU,X,CA):- atomic(C), C \= X, d(U,X,A),!. / d cu dx = cd u dx / d(UV,X,BU+AV):- d(U,X,A), d(V,X,B). / d uv dx = ud v dx + vd u dx / d(U/V,X,A):- d(UV^(-1),X,A). / d u/v dx = d (uv)^-1 dx / d(U^C,X,CU^(C-1)W):- atomic(C), C \= X, d(U,X,W). / d u^c dx = cu^(c-1)d u dx / d(log(U),X,AU^(-1)):- d(U,X,A). / d ln(u) dx = u^-1 d u dx /

/ Tính tích phân / i(0,X,0):-!. / Int 0 dx = 0 / i(X,X,(XX)/2):-!. / Int X dx = (X^2)/2 / i(C,X,CX):- atomic(C). / Int c dx = cx / i(-U,X,-A):- i(U,X,A). / Int -U dx = - Int U dx / i(U+V,X,A+B):- i(U,X,A), i(V,X,B). / Int U+V dx = Int U dx + Int V dx / i(U-V,X,A-B):- i(U,X,A), i(V,X,B). / Int U-V dx = Int U dx - Int V dx / i(CU,X,CA):- atomic(C), C \= X, i(U,X,A),!. / Int cU dx = c (Int U dx) / i(X^C,X,(X^(C+1))/(C+1)):- atomic(C),!. / Int x^c dx = x^(c+1)/(c+1) / i(U,V,UV-A):- d(V,U,A),!. / Int u dv = uv - Int v du */

/ Một số luật đơn giản / s(+,X,0,X). / x + 0 = x / s(+,0,X,X). / 0 + x = x / s(+,X,Y,X+Y). / x + y = x + y / s(+,X,Y,Z):- integer(X), integer(Y), Z is X+Y. / x + y = z <- Calculate / s(,_,0,0). / anything 0 = 0 / s(,0,_,0). / 0 anything = 0 / s(,1,X,X). / 1 x = x / s(,X,1,X). / x 1 = x / s(,X,Y,XY). / x y = x y / s(,XY,W,XZ):- integer(Y), integer(W), Z is YW.
s(,X,Y,Z):- integer(X), integer(Y), Z is XY. / x y = z <- Calculate */

/ Đơn giản hoá / simp(E,E):- atomic(E),!. simp(E,F):- E =.. [Op, La, Ra], simp(La,X), simp(Ra,Y), s(Op,X,Y,F).

Bảng so sánh

*Giao diện với C/Java cũng có thể được sử dụng cho đồ hoạ và các điều khiển.

👁️ 7 | 🔗 | 💖 | ✨ | 🌍 | ⌚
**Prolog** là một ngôn ngữ lập trình. Tên gọi Prolog được xuất phát từ cụm từ tiếng Pháp _Programmation en logique_, nghĩa là "lập trình theo lô gíc". Xuất hiện từ năm 1972 (do Alain
**SWI-Prolog** là dạng thực thi mã nguồn mở của ngôn ngữ lập trình Prolog, thường sử dụng cho việc giảng dạy và các ứng dụng Web ngữ nghĩa. Nó chứa nhiều lợi ích, thư viện
**Biểu diễn tri thức và suy luận** (**Knowledge representation and reasoning**, **KRR**, **KR&R**, **KR²**) là lĩnh vực của trí tuệ nhân tạo (AI) tập trung vào việc biểu diễn thông tin về thế giới dưới
phải|nhỏ|402x402px|[[Mã nguồn của một chương trình máy tính đơn giản được viết bằng ngôn ngữ lập trình C. Khi được biên dịch và chạy, nó sẽ cho kết quả "Hello, world!".]] **Ngôn ngữ lập trình**
Đây là bài con của **Trí tuệ nhân tạo**, nội dung chú trọng vào sự phát triển và **lịch sử ngành trí tuệ nhân tạo**. ## Sự phát triển của lý thuyết trí tuệ nhân
phải|Biểu đồ hoạt động của một trình biên dịch lý tưởng. **Trình biên dịch** () hay **phần mềm biên dịch** là một chương trình máy tính làm công việc dịch một chuỗi các câu lệnh
Mục đích của **danh sách các ngôn ngữ lập trình** này là bao gồm tất cả các ngôn ngữ lập trình hiện tại đáng chú ý, được sử dụng hiện tại và những ngôn ngữ
Trong khoa học máy tính, **lập trình ràng buộc** (tiếng Anh: _constraint programming_) là một mẫu hình lập trình trong đó mối quan hệ giữa các biến được mô tả ở dạng các ràng buộc.
Khoa học máy tính nghiên cứu các cơ sở lý thuyết của thông tin và tính toán, cùng với các kỹ thuật thực tiễn để thực hiện và
Môi trường phát triển tích hợp Eclipse phiên bản 3.1.2 trên nền Windows XP. **Eclipse** là một môi trường phát triển tích hợp dùng cho lập trình máy tính., Nó chứa một không gian làm
**Hợp nhất** phép toán (tiếng Anh: _unification_) là quá trình tìm kiếm một phép thay thế để giúp cho một cặp số hạng hoặc các cặp các biểu thức bằng nhau. Đây là một cơ
Trong khoa học máy tính, một **máy trạng thái trừu tượng** (MTT) (hay trong tiếng Anh: Abstract State Machine - ASM) là một máy trạng thái trong đó, số lượng các trạng thái không nhất
Đây là danh sách **Phần mềm mã nguồn mở**: là phần mềm máy tính được cấp phép giấy phép mã nguồn mở. Bài viết này không có tham vọng liệt kê tất cả những phần
nhỏ|phải|Biểu tượng hình con thằn lằn đôi khi được các [[lập trình viên dùng trong các chương trình viết bằng ngôn ngữ Lisp.]] **Lisp** là ngôn ngữ lập trình được phát triển từ rất sớm
thumb|**[[Phép tính lambda** là một hệ thống hình thức để định nghĩa hàm, ứng dụng hàm và đệ quy được Alonzo Church đề xuất vào những năm 193x.]] **Lý thuyết ngôn ngữ lập trình** (thường
nhỏ|Một bộ mẫu của Tháp Hà Nội **Tháp Hà Nội** là một trò chơi toán học. Tên gọi của trò chơi này gắn liền với yếu tố Việt Nam. ## Luật chơi phải|Bìa hộp đựng
**Lập trình logic** là một mẫu hình lập trình dựa trên logic toán trong các mối quan hệ và các suy luận. Các chương trình được viết trong các Ngôn ngữ lập trình logic là
**Ngôn ngữ biên dịch** (tiếng Anh: _compiled language_) là ngôn ngữ lập trình có triển khai thường là trình biên dịch (bộ dịch tạo ra mã máy từ mã nguồn), chứ không phải trình thông
Đây là danh sách các ngôn ngữ lập trình đáng chú ý, được nhóm theo loại. Vì không có sơ đồ phân loại bao quát cho các ngôn ngữ lập trình, nên trong nhiều trường
Trong điện toán, **lập trình hướng khía cạnh** (tiếng Anh: _aspect-oriented programming_, viết tắt: _AOP_) là một mẫu hình lập trình nhằm tăng tính mô đun bằng cách cho phép phân tách những mối quan
Trong lập trình máy tính, **lập trình ký hiệu** (tiếng Anh: _symbolic programming_) là một Mẫu hình lập trình trong đó chương trình có thể sử dụng những công thức và thành phần của chương
Trong khoa học máy tính, **lập trình khai báo** (tiếng Anh: _declarative programming_) là một mẫu hình lập trình theo phong cách xây dựng cấu trúc và các yếu tố của chương trình máy tính