Tổng hợp bài tập lập trình Prolog (TT)

  • Kiểm tra số tự nhiên N có phải là số nguyên tố hay không ? Tìm N số nguyên tố đầu tiên.

Số nguyên tốsố tự nhiên chỉ có hai ước số dương phân biệt là 1 và chính nó. 

Viết vị từ kiểm tra một số tự nhiên có phải là số nguyên tố hay không


kiemtranguyento(N,I):-N>1,N=I.
kiemtranguyento(N,I):-N>1,Du=N mod I , Du <> 0,I1=I+1,kiemtranguyento(N,I1).

Ví dụ gọi vị từ kiemtranguyento(5,2) thì kết quả trả về là Yes.

Diễn đạt bằng lời :

N là số ta muốn kiểm tra có phải nguyên tố hay không.

I là giá trị chạy từ I đến  N , nhiệm vụ để kiểm tra xem trong khoảng từ I cho đến N thì N có chia hết cho số nào trong khoảng đó hay không ,nếu chia hết mà lúc này I=N tức là trong khoảng từ I đến N-1 không có bất kỳ số nào mà N chia hết thì đó là số nguyên tố ,còn ngược lại trong khoảng đó N có chia hết cho số nào đó thì N không phải nguyên tố.


Viết vị từ songuyentonhohonnsapgiam để liệt kê các số nguyên tố mà nhỏ hơn hoặc bằng N sắp theo chiều giảm dần.


songuyentonhohonnsapgiam(2,[2]):-!.
songuyentonhohonnsapgiam(N,[N|Kq]):-kiemtranguyento(N,2),!,N1=N-1,songuyentonhohonnsapgiam(N1,Kq).
songuyentonhohonnsapgiam(N,Kq):-N1=N-1,songuyentonhohonnsapgiam(N1,Kq).

Ví dụ : Gọi vị từ  songuyentonhohonnsapgiam(5,Kq) thì kết quả trả về là Kq=[5,3,2].

Diễn đạt bằng lời :

Ban đầu kiểm tra xem N truyền vào có bằng 2 hay không nếu bằng 2 thì trả về kết quả là 2 (Dòng 1)

Nếu đi kiểm tra N là số nguyên tố thì trong kết quả sẽ có N và đi tìm tiếp N-1 có phải là số nguyên tố hay không (Dòng 2)

Nếu N không phải là số nguyên tố thì trong kết quả sẽ không có N và đi tìm tiếp N-1 có phải là nguyên tố hay không (Dòng 3)

Đi tìm cho đến khi nào N=2 thì dừng và trả về kết quả mảng các số nguyên tố.


Viết vị từ songuyentonhohonnsaptang để liệt kê các số nguyên tố mà nhỏ hơn hoặc bằng N sắp theo chiều tăng dần.


songuyentonhohonnsaptang(X,N,[]):-X>N,!.
songuyentonhohonnsaptang(X,N,[X|Kq]):-kiemtranguyento(X,2),!,X1=X+1,songuyentonhohonnsaptang(X1,N,Kq).
songuyentonhohonnsaptang(X,N,Kq):-X1=X+1,songuyentonhohonnsaptang(X1,N,Kq).

Ví dụ : Gọi vị từ songuyentonhohonnsaptang (2,5,Kq) thì kết quả trả về là Kq=[2,3,5].

Diễn đạt bằng lời :

là số tăng từ 2 cho đến N  . X<=N

Kiểm tra xem X có phải là nguyên tố hay không nếu X là nguyên tố thì trong kết quả có X và đi kiểm tra X+1 có phải là nguyên tố hay không.(Dòng 2)

Nếu X không phải là nguyên tố thì vẫn đi tìm X+1 có phải là nguyên tố hay không (Dòng 3)

Tìm cho đến khi X>N thì dừng lại và trả về kết quả .(Dòng 1).

Còn có cách  khác như sau :


songuyentonhohonnsaptang2(1,Phu,Phu):-!.
songuyentonhohonnsaptang2(X,Phu,Kq):-kiemtranguyento(X,2),!,X1=X-1,PhuMoi=[X|Phu],songuyentonhohonnsaptang 2(X1,PhuMoi,Kq).
songuyentonhohonnsaptang2(X,Phu,Kq):-X1=X-1,songuyentonhohonnsaptang 2(X1,Phu,Kq).


  • Đão ngược trật tự mọi phần tử của một danh sách

daonguocdanhsach(DS,Kq):-daonguocdanhsachx(DS,[],Kq).

daonguocdanhsachx([],Phu,Phu).
daonguocdanhsachx([Dau|Duoi],Phu,Kq):-PhuMoi=[Dau|Phu],daonguocdanhsachx(Duoi,PhuMoi,Kq).

Ví dụ : Gọi vị từ  daonguocdanhsach([1,2,3,4,5],Kq) thì kết quả trả về là Kq=[5,4,3,2,1].

Hoặc có thể gọi vị từ daonguocdanhsachx([1,2,3,4,5],[],Kq) thì kết quả trả về là Kq=[5,4,3,2,1].

Diễn đạt bằng lời :

Khi gọi vị từ daonguocdanhsachx thì Phụ ban đầu là rỗng sau đó gán phần tử đầu vào vị trí đầu tiên của Phụ được Phụ Mới ,duyệt như vậy cho đến khi danh sách rỗng thì Kq bằng danh sách Phụ đã tìm được trước đó .(Dòng 2, Dòng 3)

Khi gọi vị từ daonguocdanhsach thì nó sẽ gọi đến daonguocdanhsachx với Phu là rỗng rồi duyệt danh sách như giải thích bên trên.  


  • Xây dựng vị từ thuộc trong đó có thêm một đối số để trả vệ trị TRUE nếu phần tử x thuộc danh sách l cho trước và FALSE trong trường hợp ngược lại .

thuoc(_,[],"FALSE").
thuoc(X,[X|_],"TRUE"):-!.
thuoc(X,[_|Duoi],Kq):-thuoc(X,Duoi,Kq).

Ví du gọi vị từ thuoc(2,[1,2,3,4],Kq) thì Kq=TRUE

Hoặc thuoc(5,[1,2,3,4],Kq) thì kq=FALSE

Diễn đạt bằng lời :

Nếu phần tử X xuât hiện tại vị trí nào đó trong danh sách thì Kq=”TRUE” còn ngược lại thì duyệt danh sách về Đuôi (Dòng 1 , Dòng 2) nếu duyệt đến khi danh sách đã rỗng thì Kq=”FALSE” (Dòng 1)


  • Xây dựng quy tắc NằmNgoài(x,L) để kiểm tra xem x không thuộc danh sách L 

namngoai(_,[]).
namngoai(X,[X|_]):-!,fail.
namngoai(X,[_|Duoi]):-namngoai(X,Duoi).

Ví du gọi vị từ namngoai(2,[1,2,3]) thì kết quả là No

Hoặc gọi vị từ namtrong(5,[1,2,3]) thì thì kết quả là Yes

Diễn đạt bằng lời :

Nếu duyệt danh sách phần tử đầu của danh sách không trùng với X thì duyệt về phần đuôi của danh sách cho đến khi danh sách rỗng thì trả về  Yes (Dòng 1 ,Dòng 3)

Nếu trong khi duyệt danh sách có phần tử trùng với X thì sử dụng nhát cắt để dừng việc tìm kiếm và đồng thời trả về fail ,kết quả là No. (Dòng 2).


  • Xây dựng quy tắc khacnhau(L) để kiểm tra danh sách L không có phần tử trùng nhau

khacnhau([]).
khacnhau([Dau|Duoi]):-namngoai(Dau,Duoi),!,khacnhau(Duoi).

Ví du gọi vị từ khacnhau([1,2,2,3]) thì kết quả là No

khacnhau([1,2,3]) thì kết quả là Yes

Diễn đạt bằng lời :

Nếu phần tử đầu  nằm ngoài danh sách đuôi (tức là không có phần tử nào thuộc danh sách đuôi ) thì tiếp tục đi về đuôi để kiểm tra .

Nếu như phần tử đầu trùng với phần tử nào đó trong đuôi gặp nhát cắt dừng chương trình và trả kết quả về sai (No) (Dòng 2)

Nếu duyệt hết danh sách mà tất cả đều thỏa thì trả về kết quả đúng (True) (Dòng 1)


  • Xây dựng quy tắc phandau(l1,l2) để kiểm tra danh sách l1 là phần đầu của danh sách l2

phandau([],_).
phandau([Dau1|Duoi1],[Dau2|Duoi2]):-Dau1=Dau2,phandau(Duoi1,Duoi2).

Ví du gọi vị từ khacnhau([1,2,2],[1,2,2,3]) thì kết quả là Yes

khacnhau([1,2,4],[1,2,3,4]) thì kết quả là No

Diễn đạt bằng lời :

Duyệt 2 danh sách nếu phần tử đầu của danh sách 1 trùng với phần tử đầu của danh sách 2 thì duyệt tiếp phần đuôi của danh sách 1 và đuôi của danh sách 2 ,ngược lại thì dừng và trả về kết quả sai.(Dòng 2)

Nếu duyệt hết danh sách 1 thì kết quả trả về đúng (Các phần tử trong danh sách 1 đều thỏa điều kiện ) (Dong 1).


  • Xây dựng quy tắc namtronglientiep(l1,l2) để kiểm tra mọi phần tử của l1 đều nằm liên tiếp trong danh sách l2

namtronglientiep([],_).
namtronglientiep([Dau1|Duoi1],[Dau2|Duoi2]):-Dau1=Dau2,!,namtronglientiep(Duoi1,Duoi2).
namtronglientiep([Dau1|Duoi1],[_|Duoi2]):-namtronglientiep([Dau1|Duoi1],Duoi2).

Ví du gọi vị từ namtronglientiep([1,2,3],[5,6,7,1,2,3]) thì kết quả là Yes

namtronglientiep([1,2,4],[1,2,3,4]) thì kết quả là No

Diễn đạt bằng lời :

Nếu phần tử đầu của danh sách 1 bằng phần tử đầu của danh sách 2 thì duyệt về phần đuôi của danh sách 1 và danh sách 2 ,ngược lại nhảu xuống Dòng 3 (Dòng 2)

Xét phần tử đầu của danh sách 1 có nằm trong phần đuôi của danh sách 2 hay không (Dòng 3)

Nếu đã duyệt hết danh sách thứ 1 mà mọi điều kiện thỏa thì trả về kết quả đúng ( Dòng 1).


  • Xây dựng quy tăc phân hoạch(L,U,V,W) để phân hoạch danh sách L thành 3 danh sách U,V,W .

phanhoach([],[],[],[]).
phanhoach([Dau|Duoi],U,[Dau|V],W):-Dau=10,!,phanhoach(Duoi,U,V,W).
phanhoach([Dau|Duoi],[Dau|U],V,W):-Dau<=10,!,phanhoach(Duoi,U,V,W).
phanhoach([Dau|Duoi],U,V,[Dau|W]):-phanhoach(Duoi,U,V,W).

Ví dụ : gọi vị từ phanhoach([1,2,3,4,5,6,7,8,9,10,11,12,13,10],U,V,W) thì kết quả là U=[1,2,3,4,5,6,7,8,9] , V=[10,10] , W=[11,12,13] .

Diễn đạt bằng lời :

Nếu phần tử đầu của danh sách Dau =10 thì nó được cho vào danh sach V  và duyệt tiếp phần đuôi của danh sách L nếu điều kiện không thỏa thì sử dụng nhát cắt dừng việc tìm kiếm kết quả đi xuống dòng tiếp theo (Dòng 2)

Nếu phần tử đầu của danh sách Dau <=10 thì nó được cho vào danh sach U và duyệt tiếp phần đuôi của danh sách L nếu điều kiện không thỏa thì sử dụng nhát cắt dừng việc tìm kiếm kết quả đi xuống dòng tiếp theo (Dòng 3)

Nếu đã đi qua các điệu kiện trên Dau =10 và Dau <=10 mà không thỏa thì phần đầu lúc này sẽ Dau > 10 và cho vào danh sách V (Dòng 4).

Nếu duyệt hết danh sách thì các danh sách U , V ,W là rỗng sau đó quay lui trở lại để lấy kết quả của mỗi danh sách mà lúc đầu nếu thỏa điều kiện đã gán vào danh sách đo (Dòng 1)


  • Xuất ra mọi hoán vị của những phần tử của danh sách cho trước

noi([],L2,L2).
noi([X|Duoi1],L2,[X|Kq]):-noi(Duoi1,L2,Kq).

hoanvi([],[]).
hoanvi([Dau|Duoi],Kq):-hoanvi(Duoi,KqDuoi),noi(L1,L2,KqDuoi),noi(L1,[Dau],Tam),noi(Tam,L2,Kq).

Hàm bổ trợ để tạo ra đường dẫn thân thiện (Url Friendly)

Đây là các hàm bổ trợ để tạo đường dẫn thân thiện cho website các bạn có thể tham khảo ở đây :

Ví dụ chúng ta có 1 chuỗi như sau : 

Điện thoại Samsung Galaxy J7 Prime

sau khi chuyển đổi thì chuỗi ban đầu sẽ trở thành :

dien-thoai-samsung-galaxy-j7-prime


//Hàm bổ trợ cho việc tạo Url thân thiện
function makeUrl($string)
{
  //Loại bỏ dấu của chữ
  $string=strU($string);
  //Cắt khoảng trắng ở đầu và cuối chuỗi
  $string=trim($string);
  //Thay thế khoảng trắng giữa các từ bằng dấu gạch ngang
  $string=str_replace(" ","-",$string);
  //Chuyển chuỗi về dạng chữ in thường
  $string=strtolower($string);
  //Trả về kết quả sau khi biến đổi
  return $string;
}
//Hàm loại bỏ dấu của chữ
function strU($str)
{
  $str = preg_replace("/(à|á|ạ|ả|ã|â|ầ|ấ|ậ|ẩ|ẫ|ă|ằ|ắ|ặ|ẳ|ẵ)/", 'a', $str);
  $str = preg_replace("/(è|é|ẹ|ẻ|ẽ|ê|ề|ế|ệ|ể|ễ)/", 'e', $str);
  $str = preg_replace("/(ì|í|ị|ỉ|ĩ)/", 'i', $str);
  $str = preg_replace("/(ò|ó|ọ|ỏ|õ|ô|ồ|ố|ộ|ổ|ỗ|ơ|ờ|ớ|ợ|ở|ỡ)/", 'o', $str);
  $str = preg_replace("/(ù|ú|ụ|ủ|ũ|ư|ừ|ứ|ự|ử|ữ)/", 'u', $str);
  $str = preg_replace("/(ỳ|ý|ỵ|ỷ|ỹ)/", 'y', $str);
  $str = preg_replace("/(đ)/", 'd', $str);
  $str = preg_replace("/(À|Á|Ạ|Ả|Ã|Â|Ầ|Ấ|Ậ|Ẩ|Ẫ|Ă|Ằ|Ắ|Ặ|Ẳ|Ẵ)/", 'A', $str);
  $str = preg_replace("/(È|É|Ẹ|Ẻ|Ẽ|Ê|Ề|Ế|Ệ|Ể|Ễ)/", 'E', $str);
  $str = preg_replace("/(Ì|Í|Ị|Ỉ|Ĩ)/", 'I', $str);
  $str = preg_replace("/(Ò|Ó|Ọ|Ỏ|Õ|Ô|Ồ|Ố|Ộ|Ổ|Ỗ|Ơ|Ờ|Ớ|Ợ|Ở|Ỡ)/", 'O', $str);
  $str = preg_replace("/(Ù|Ú|Ụ|Ủ|Ũ|Ư|Ừ|Ứ|Ự|Ử|Ữ)/", 'U', $str);
  $str = preg_replace("/(Ỳ|Ý|Ỵ|Ỷ|Ỹ)/", 'Y', $str);
  $str = preg_replace("/(Đ)/", 'D', $str);
  $str = preg_replace("/[^A-Za-z0-9 ]/", '', $str);
  $str = preg_replace("/\s+/", ' ', $str);
  $str = trim($str);
  return $str;
}

Cài đặt OpenCV cho Android Studio

  • Giới thiệu

OpenCV là một thư viện mã nguồn mở hàng đầu cho thị giác máy tính (computer vision), xử lý ảnh và máy học, và các tính năng tăng tốc GPU trong hoạt động thời gian thực.

OpenCV được phát hành theo giấy phép BSD, do đó nó hoàn toàn miễn phí cho cả học thuật và thương mại. Nó có các interface C++, C, Python, Java và hỗ trợ Windows, Linux, Mac OS, iOS và Android. OpenCV được thiết kế để tính toán hiệu quả và với sự tập trung nhiều vào các ứng dụng thời gian thực. Được viết bằng tối ưu hóa C/C++, thư viện có thể tận dụng lợi thế của xử lý đa lõi. Được sử dụng trên khắp thế giới, OpenCV có cộng đồng hơn 47 nghìn người dùng và số lượng download vượt quá 6 triệu lần. Phạm vi sử dụng từ nghệ thuật tương tác, cho đến lĩnh vực khai thác mỏ, bản đồ trên web hoặc công nghệ robot. (nguồn Google.com)

  • Cách cài đặt 

Bước 1 : Tải OpenCV cho Android Studio

Vào trang http://opencv.org/releases.html để tải OpenCV tải phiên bản mới nhất tình từ thời điểm này là phiên bản 3.2.0 ,ta chọn gói cho Android

Sau khi dowload thành công ta giải nén file zip vừa tải được

Bước 2 : Tạo project Trong Android Studio 

Ta tiến hành tạo project mới có tên TestOpenCV

Sau đó Click Next để tiếp tục

Ở đây mình để Minimum SDK là API 15 cho hệ điều hành Android 4.0.3

Chọn Project Rỗng sau đó nhấn Next để tiếp tục việc tạo Project

Đặt tên cho Activity Name sau đó nhấn Finish

Bước 3 : Import thư viện OpenCV vào Android Studio

Ta vào thư mục OpenCV mà ta đã tải và giải nén chọn vào sdk – > java và lấy đường dẫn giống hình bên dưới nhấn Ctrl + C để copy đường dẫn này ,hiện tại đường dẫn của mình như trong hình là :

C:\Users\PC\Desktop\MyOpenCV\OpenCV-android-sdk\sdk\java

Sau đó chuyển sang Project Android lúc trước mà ta vừa tạo Chọn File -> New -> Import Module

Màn hình Thêm module mới sẽ hiện ra ta tiến hành dán đường dẫn lúc trước đã copy vào đây sau đó Android Studio sẽ nhận ra được thư viện OpenCV ta nhấn vào next để tiếp tục và tiến hành xác nhận thao tác này

Sau đó ta sẽ thấy nó xuất hiện một thông báo lỗi như hình bên dưới ,hãy bình tĩnh và sửa lỗi thôi

Ta tiến hành click chuột phải vào app và chọn Open Module Settings

Sau đó ta click vào app chọn Tab Dependences -> chọn add và chọn Module dependency

Và một hộp thoại hiện lên ta tiến hành việc chọn Module :openCVLibrary320 cho Project sau đó click OK

Thư viện đã được thêm vào click OK 1 lần nữa nhé

Tiếp theo ta vào activity_main.xml vào phần Design để chọn cho đúng cấu hình API hỗ trợ ở đây mình sử dụng Android API 22

 

Mọi thứ đến giờ có lẽ ổn ta tiến hành chọn phần thể hiện thư mục là Project chọn đến openCVLibrary320 tìm đến source và click vào build.gradle để tiến hành thiết lập lại thông tin cho đúng .

CompileSdkVersion mình điền vào là 22 do lúc trước đó mình chạy trên Android API 22 targetSdkVersion cũng vậy.

minSdkVersion thì lúc đầu mình tạo project là 15 đúng không ?

buildToolsVersion cứ để mặc định của nó là 23.0.2

Ta tiến hành đồng bộ Project thử xem có lỗi gì xảy ra nữa không nhé .Để đồng bộ project ta chọn vào File -> Synchronize hoặc ấn tổ hợp phím Ctrl + Alt + Y .

Nếu có thông báo lỗi như hình bên dưới thì Click vào link xanh xanh bên dưới để cài đặt Built Tools phiên bản 23.0.2 cho Project

Nó đang tiến hành việc tải và cài đặt bạn đợi xí nhé ,sau khi tải về đồng bộ cho Project 1 lần nữa như bước trước đó.

Có lẽ mọi thứ vẫn ổn nhưng ta phải tiến hành add thêm các file trong phần native library nữa nó mới chạy được thành công nhé ,ta vào lại Folder ban đầu mà ta tiến hành giải nén vào sdk -> native -> libs sẽ thấy các thư mục như hình bên dưới ta tiến hành copy tất cả các thư mục này ra 1 folder ngoài Desktop cho dễ xử lý .

Đặt tên Folder đó là jniLibs và copy toàn bộ các Folder đó vào đây .

Sau đó vào từng thư mục xóa tất cả các file có đuôi .a ở tất cả các thư mục

arm64-v8a

armeabi

armeabi-v7a

mips

mips64

x86

x86_64

chỉ để lại file có đuôi .so trong các thư mục đó (mỗi folder chỉ có 1 file .so)

Để lại 1 file .so tại mỗi thư mục

Sau khi hoàn thành các bươc trên ta tiến hành copy Folder jniLibs Vào phần thư mục main của project như hình

Trong  actyvity_main.xml ta vào phần Text để thiết kế giao diện có 1 TextView như sau

Sau đó ta chuyển qua lớp MainActivity.java để tiến hành viết code Test chương trình ,nếu OpenCV mà Load thành công thì TextView sẽ có dòng chữ “Load OpenCV Successful”

Nếu sau khi viết code Start chương trình thành công thi sẽ được như hình bên dưới

Các bạn thử cài đặt xem có được không nhé nếu có gì sai sót các bạn để lại bình luận bên dưới để xây dựng bài viết nhé .Mình sẽ ra tiếp Series về OpenCV ,tại mình cũng đang thích thú về nó .Chúc các bạn tạo Project thành công !

Tự Học Lập Trình Vi Điều Khiển Không Cần Mua Mạch Arduino-01 (Led nhấp nháy)

  • GIới thiệu 

Để dễ dàng thực hành và tiếp cận với lập trình vi điều khiển thì Autodesk đã tạo ra môi trường giả lập Arduino  giúp mọi người thực hành trên vi mạch ảo ,tiết kiệm chi phí khi mua vi mạch thật .Chỉ cần thao tác đơn giản là click vào trang https://circuits.io tạo một tài khoản và thực hành ngay.

  • Chương trình led nhấp nháy đầu tiên   

Sau khi tạo tài khoản và đăng nhập thành công ta nhìn trên thanh menu thấy chức năng New chọn New Elictronic Lab như hình bên dưới như vậy chúng ta đã có thể kéo thả các vi mạch vào nối dây và viết code ,chạy chương trình thử nghiệm được rồi .

Ta vào vùng Add Components để chọn mạch và led

Chọn Arduino Uno R3 và 1 con led

Sau khi đã kéo thả vào vùng thiết kế Mạch Arduino Uno và 1 con led màu đỏ thì ta tiến hành lắp chân âm ở GND và chân dương ở chân số 13 (chân dương là chân dài ,còn chân âm là chân ngắn hơn ngoài thực tế)

Sau đó ta tiến hành viết code cho mạch đèn mới lắp ở phần Code Editor


//Khai báo biến cho chân led 13
 int led = 13;

//Hàm khởi tạo thiết lập thông tin các chân
void setup() {
 // thiết lập chế độ cho chân led 13 là phát ra tín hiệu
  pinMode(led, OUTPUT);
}

// Vòng lặp vô hạn cho chương trình
void loop() {
  digitalWrite(led, HIGH); // Bật led tại chân 13
  delay(1000); // Trì hoãn 1 giây
  digitalWrite(led, LOW); // Tắt led tại chân 13
  delay(1000); // Trì hoãn 1 giây
}

Viết code xong ta tiến hành Run code bằng cách bầm vào Start Simulation và đèn bây giờ đã sáng chớp nháy giống như phần mô tả code ở bên trên

Run code here : https://circuits.io/circuits/4721979-the-unnamed-circuit/edit

 

 

Thủ Thuật PHP

  • Hàm cắt chuỗi và giới hạn nội dung hiển thị

function TextShorten($text,$limit=400)
{
   $text=$text." ";
   $text=substr($text,0,$limit);
   $text=substr($text,0,strrpos($text,' '));
   $text=$text."...";
   return $text;
}

  • Hàm loại bỏ các ký tự đặc biệt phòng chống Sql Injection

 public function Validation($data)
 {
    $data=trim($data);
    $data=stripcslashes($data);
    $data=htmlspecialchars($data);
    return $data;
 }

  • Favicon ICon

<link rel="shortcut icon" href="./public/images/favicon.ico" type="image/ico" sizes="16x16">

  • htaccess

  – Hiển thị page 404 khi có lỗi

ErrorDocument 404 /ShopCart/404.php

  – Ngăn chặn người dùng xem List Directory

IndexIgnore *

 

Tổng hợp bài tập lập trình Prolog

  • Tìm phần tử thứ nhất
timdautien([Dau|Duoi],Dau).

Ví dụ : Gọi vị từ  timdautien([12,4,2,3,4,5],Kq) thì kết quả trả về là Kq=12.

 

Diễn đạt bằng lời :

Truyền vào danh sách lấy phần tử đầu gán cho kết quả


  • Tìm phần tử thứ hai
timhai([_,Y|_],Y).

Ví dụ : Gọi vị từ  timhai([4,3,4,5],Kq) thì kết quả trả về là Kq=3.

Diễn đạt bằng lời :

Truyền vào danh sách không quan tâm thằng thứ nhất là ai cả (để nó là vô danh) lấy phần tử thứ 2 gán cho kết quả.


  • Tìm phần tử thứ cuối
timcuoi([X],X).
timcuoi([_|Duoi],Kq):-timcuoi(Duoi,Kq).

Ví dụ : Gọi vị từ  timcuoi([4,3,4,5],Kq) thì kết quả trả về là Kq=5.

Diễn đạt bằng lời :

Truyền vào danh sách không quan tâm thằng thứ nhất là ai cả (để nó là vô danh) ,chưa đến cuối cùng của danh sách thì cứ tiếp tục tìm. (Dòng code 2).

Nếu X là thằng cuối cùng thì gán Kq là X (Dòng code 1).


  • Lấy ra phần tử đầu tiên trùng với X
layphantudau([],_,[]).
layphantudau([X|Duoi],X,Duoi):-!.
layphantudau([Dau|Duoi],X,[Dau|Kq]):-layphantudau(Duoi,X,Kq).

Ví dụ : Gọi vị từ  layphantudautien([1,1,2,3,4,5],1,Kq) thì kết quả trả về là Kq=[1,2,3,4,5].

Diễn đạt bằng lời :

Nếu trong danh sách phần tử đầu không trùng với X thì đi tìm ở danh sách đuôi và kết quả phải có đầu (nhớ phần tử đầu cho kết quả trả về) (Dòng code 3)

Nếu gặp phần tử nào đó trùng thì trong kết quả không có X (không nhớ X) dừng và đệ quy ngược lại lấy các phần tử trước đó đã nhớ ghép vào danh sách .(Dòng code 2)

Nếu đi hết danh sách mà không có phần tử nào trùng với X thì sao nhỉ thì danh sách kết quả sẽ bằng rỗng và đệ quy ngược lại lấy các phần tử trước đó đã nhớ để trả về danh sách ban đầu (không xóa được phần tử nào ).(Dòng code 1)


  • Lấy ra tất cả các phần tử trùng với X

Bài này cũng giống như bài ở trên nhưng có biến đổi 1 tí


layratatcaphantu([],_,[]).
layratatcaphantu([X|Duoi],X,Kq):-layratatcaphantu(Duoi,X,Kq),!.
layratatcaphantu([Dau|Duoi],X,[Dau|Kq]):-layratatcaphantu(Duoi,X,Kq).

Ví dụ : Gọi vị từ layratatcaphantu([1,1,2,3,1,4,5],1,Kq) thì kết quả trả về là Kq=[2,3,4,5].

Diễn đạt bằng lời :

Nếu gặp phần tử đầu trùng với X thì trong kết quả sẽ không có X tiếp tục đi tìm lời giải ở phần đuôi . Nếu phần tử đầu không trùng với X thì không thỏa điều kiện gặp nhát cắt dừng việc tìm kiếm lại (Dòng code 2), đi xuống dòng code 3 đưa phần tử đầu mà không trùng với X đó vào kết quả và tiếp tục đi tìm lời giải ở đuôi.(Dòng code 3)

Nếu danh sách đuôi tìm kiếm đã hết thì kết quả bằng rỗng và đệ quy ngược trở lại ghép những phần tử đã được đưa vào kết quả trước đó.


  • Xuất ra các cặp phần tử kế tiếp nhau trong danh sách

xuatcacphantuketiepnhau([]).
xuatcacphantuketiepnhau([X,Y|Duoi]):-write(X,"--",Y),xuatcacphantuketiepnhau([Y|Duoi]).

Ví dụ : Gọi vị từ xuatcacphantuketiepnhau([1,2,3,4,5],1,Kq) thì kết quả trả về là :

1–2

2–3

3–4

4–5

Diễn đạt bằng lời :

Nếu có phần tử X và Y bất kỳ ở đầu thì thực hiện việc xuất X và Y sau đó tiếp tục đi về phần đuôi để thực hiện việc xuất nhưng ở phần đuôi không được bỏ qua Y ,xuất X và Y cho đến khi nào danh sách rỗng.


  • Tạo danh sách tất cả các phần tử ở vị trí chẵn của danh sách dữ liệu L 

♦ Giữ nguyên trật tự xuất hiện trong L

phantuovitrichan([],[]).
phantuovitrichan([_],[]).
phantuovitrichan([_,Chan|Duoi],[Chan|KQ]):-phantuovitrichan(Duoi,KQ).

Ví dụ : gọi vị từ phantuovitrichan([1,2,3,4,5,6,7],Kq) thì kết Kq=[2,4,6]

Diễn đạt bằng lời :

Phần tử đầu là phần tử ở vị trí lẻ không quan tâm nó ,quan tâm phần tử sau nó là phần tử chẵn cho vào kết quả cần tìm ,nếu danh sách ban đầu vẫn còn phần tử thì đi về đuôi để tiếp tục lấy phần tử chẵn.(Dòng 3)

Nếu danh sách là rỗng (số phần tử của danh sách là chẵn) hoặc danh sách chỉ còn đúng 1 phần tử (số phần tử của danh sách là lẻ) thì kết quả bằng rỗng dừng việc đệ quy và quay ngược trở lại để lấy các phần tử chẵn trước đó cho kết quả .(Dòng 1 ,2).

♦ Đão ngược trật tự


phantuovitrichandao([],Phu,Phu).
phantuovitrichandao([_],Phu,Phu).
phantuovitrichandao([_,Chan|Duoi],Phu,Kq):-PhuMoi=[Chan|Phu],phantuovitrichandao(Duoi,PhuMoi,Kq).

Ví dụ : gọi vị từ phantuovitrichandao([1,2,3,4,5,6,7],[],Kq) thì kết Kq=[6,4,2]

Diễn đạt bằng lời :

Ban đầu ta truyền vào Phụ bằng rỗng ,Lấy phần tử ở vị trí chẵn đưa vào đầu của Phụ ta có được Phụ mới sau khi có được phụ mới ta tiếp tục tìm ở phần Đuôi của danh sách với Phụ là Phụ mới (Dòng 3).

Tìm các phần tử ở vị trí chẵn cho đến khi danh sách chỉ còn lại một phần tử (Danh sách với số phần tử lẻ ) hoặc đã duyệt qua tất cả các phần tử danh sách duyệt còn lại rỗng (Danh sách với số phần tử chẵn), dừng lại và gán Phụ đã tìm được từ các bước trước cho kết quả Kq=Phu.(Dòng 1 , 2).


  • Xây dựng danh sách mà các phần tử là căn bậc hai của các phần tử tương ứng trong danh sách L các số thực cho trước

danhsachcanbachai([],[]).
danhsachcanbachai([Dau|Duoi],[SoCanBacHai|Kq]):-SoCanBacHai=Sqrt(Dau),danhsachcanbachai(Duoi,Kq).

Ví dụ : gọi vị từ danhsachcanbachai([2,4],Kq) thì kết Kq=[1.4142135624,2].

Diễn đạt bằng lời :

Duyệt qua danh sách ban đầu tính căn bậc hai của từng giá trị rồi cho vào kết quả .


  • Trộn danh sách xen kẽ

tronxenke([],[X],[X]).
tronxenke([X],[],[X]).
tronxenke([Dau1|Duoi1],DS2,[Dau1|Kq]):-tronxenke(DS2,Duoi1,Kq).

Ví dụ : gọi vị từ tronxenke([1,2,3],[4,5,6],Kq) thì kết Kq=[1,4,2,5,3,6].

Diễn đạt bằng lời :

Duyệt danh sách thứ 1 và thứ 2 xen kẻ nhau cho đến khi danh sách thứ nhất chỉ còn 1 phần tử và danh sách thứ 2 rỗng hoặc danh sách thứ 1 rỗng và danh sách thứ 2 chỉ còn một phần tử thì kết quả chứa phần tử cuối cùng đó , quay trở ngược lại gom các phần tử đã trộn xen kẻ trước đó cho kết quả hoàn chỉnh .


  • Ai nói thật ai nói láo.

sinh2(0).
sinh2(1).
sinhDS([],0):-!.
sinhDS([Dau|Duoi],N):-sinh2(Dau),N1=N-1,sinhDS(Duoi,N1).

tong([],0).
tong([Dau|Duoi],Kq):-tong(Duoi,KQDuoi),Kq=KqDuoi+Dau.

anoi([1|Duoi]):-tong([1|Duoi],SoThat),SoThat=1.
anoi([0|Duoi]):-tong([0|Duoi],SoThat),SoThat1.

cnoi([A,B,1]):-tong([A,B,1],SoThat),SoThat=0.
cnoi([A,B,0]):-tong([A,B,0],SoThat),SoThat>0.

Suyluan(L,N):- sinhDS(L,N),anoi(L),cnoi(L).


  • Pythagore điều kiện :  0<x<y<z , x^2+y^2=z^2,UCLN(x,y,1) : Ước chung lớn nhất của x và y bằng 1.
ucln(X,X,X):-!.
ucln(X,Y,KQ):-X>0,Y>0,X>Y,X1=X-Y,!,ucln(X1,Y,KQ).
ucln(X,Y,KQ):-X>0,Y>0,Y1=Y-X,ucln(X,Y1,KQ).
 
sinhso(I,I,_).
sinhso(I,KQ,ChanTren):-I1=I+1,I1<ChanTren,sinhso(I1,KQ,ChanTren).

pytago(X,Y,Z):-sinhso(1,Z,100),sinhso(1,X,Z),
sinhso(1,Y,Z),X<Y,ucln(X,Y,1),X*X+Y*Y=Z*Z.

  • Selection Sort

min([X],X).
min([X,Y|T],KQ):-X>Y,!,min([Y|T],KQ).
min([X,_|T],KQ):-min([X|T],KQ).

delete(_,[],[]).
delete(X,[X|T],KQ):-!,delete(X,T,KQ).
delete(X,[H|T],[H|KQ]):-delete(X,T,KQ).

selection_sort([],[]).
selection_sort(L,[Min|KQ]):-min(L,Min),
delete(Min,L,L1),
selection_sort(L1,KQ).

Run code : Here


  • Insertion Sort

insert(X,[H|T],[H|KQ]):-X>=H,!,insert(X,T,KQ).
insert(X,T,[X|T]).

insertion_sort([],[]).
insertion_sort([H|T],KQ):-insertion_sort(T,KQ1),insert(H,KQ1,KQ).


  • Quick Sort 

noi([],P,P).
noi([D|C],P,Result):-noi(C,[D|P],Result).

ph(_,[],[],[]).
ph(Moc,[D|C],[D|LBe],LLon):-D<=Moc,!,
ph(Moc,C,LBe,LLon).
ph(Moc,[D|C],LBe,[D|LLon]):-ph(Moc,C,Lbe,LLon).

qs([],[]).
qs([D|C],Result):-ph(D,C,LBe,LLon),
qs(LBe,Be),qs(LLon,Lon),noi(Be,[D],Tam),
noi(Tam,Lon,Result).

 

I wanna share something