2015-10-02 13 views
7

Tôi đang cố gắng để chuyển đổi một chuỗi đến một danh sách các ascii-mã như vậy:SWI-Prolog làm thế nào để hiển thị toàn bộ câu trả lời (danh sách)?

7 ?- string_to_list("I'm a big blue banana in space!", C). 
C = [73, 39, 109, 32, 97, 32, 98, 105, 103|...]. 

8 ?- 

này không cho tôi toàn bộ danh sách như bạn có thể nhìn thấy, nhưng tôi cần nó.

This solution does not work: Tôi không thể nhấn w vì nó mang lại cho tôi câu trả lời và dừng hẳn. Neither does this: Tôi có thể gọi hàm này là không sao và nó trả về true, nhưng danh sách vẫn chưa được hiển thị đầy đủ.

11 ?- set_prolog_flag(toplevel_print_options,[quoted(true), portray(true), max_depth(0), spacing(next_argument)]). 
true. 

12 ?- string_to_list("I'm a big blue banana in space!", C). 
C = [73, 39, 109, 32, 97, 32, 98, 105, 103|...]. 

13 ?- 

Bất kỳ trợ giúp nào được đánh giá cao!

+3

Bạn có thể sử dụng thủ thuật sau đây để đưa bạn vào tình huống mà bạn có thể nhấn "w": Thêm điểm lựa chọn nhân tạo bằng cách gắn thêm '; 0 = 1.' cho truy vấn của bạn, ví dụ: '? - your_goal; 0 = 1.' hoặc dài hơn một chút: '? - your_goal; false.'. Trên backtracking, nhấn "w" để in tất cả mọi thứ. – mat

+0

@mat ngay bây giờ, với phiên bản phát triển SWI-Prolog mới nhất, làm điều này một lần khiến tất cả các truy vấn tiếp theo ở cấp cao nhất để hiển thị toàn bộ các điều khoản của tất cả các ràng buộc biến. Đó có phải là một tính năng không? –

Trả lời

8
?- set_prolog_flag(answer_write_options,[max_depth(0)]). 
true. 

?- string_to_list("I'm a big blue banana in space!", C). 
C = [73,39,109,32,97,32,98,105,103,32,98,108,117,101,32,98,97,110,97,110,97,32,105,110,32,115,112,97,99,101,33]. 

có nên ở nơi đây trên SO câu trả lời tương tự ... Tôi đang sử dụng phiên bản SWI-prolog cuối cùng, chỉ cần biên soạn ...

+0

Điều này làm việc kỳ diệu, cảm ơn. – Mossmyr

2

Chỉ cần đặt comment by @mat trong một câu trả lời:

?- string_codes("string_to_list/2 is deprecated; use string_codes/2!", Codes) 
    ; 
    false. 
Codes = [115, 116, 114, 105, 110, 103, 95, 116, 111|...] /* press w */ [write] 
Codes = [115, 116, 114, 105, 110, 103, 95, 116, 111, 95, 108, 105, 115, 116, 47, 50, 32, 105, 115, 32, 100, 101, 112, 114, 101, 99, 97, 116, 101, 100, 59, 32, 117, 115, 101, 32, 115, 116, 114, 105, 110, 103, 95, 99, 111, 100, 101, 115, 47, 50, 33] /* press enter */. 

Tuy nhiên, từ đây trên tất cả các điều khoản sẽ được hiển thị hoàn toàn. Điều này có thể gây phiền nhiễu.

gì bạn cũng có thể làm là chỉ cần sử dụng một trong những vị in ấn:

?- ..., writeln(Codes). 

nhưng điều này không được tán thành đối với một số lý do. Nó chắc chắn hữu ích nếu bạn có một số ràng buộc được báo cáo trong câu trả lời, nhưng bạn chỉ muốn xem giá trị đầy đủ của một trong các biến:

?- numlist(1,1000,L), 
    Codes = `This is a code list in SWI-Prolog V7`. 
L = [1, 2, 3, 4, 5, 6, 7, 8, 9|...], 
Codes = [84, 104, 105, 115, 32, 105, 115, 32, 97|...]. 

?- numlist(1,1000,L), 
    Codes = `This is a code list in SWI-Prolog V7`, 
    writeln(Codes). 
[84,104,105,115,32,105,115,32,97,32,99,111,100,101,32,108,105,115,116,32,105,110,32,83,87,73,45,80,114,111,108,111,103,32,86,55] 
L = [1, 2, 3, 4, 5, 6, 7, 8, 9|...], 
Codes = [84, 104, 105, 115, 32, 105, 115, 32, 97|...]. 
0

Tôi đã tìm thấy hai cách.


1.

?- set_prolog_flag(answer_write_options,[max_depth(0)]). 
true. 

Sau đó làm lệnh của bạn cũng được in một danh sách cắt ngắn.

(set_prolog_flag documentation)


2.

?- atom_chars(goodbye_prolog, X) ; true. 

(AllOutput documentation)

Đặt ; true. ở phần cuối của các cuộc gọi mà kết quả trong một danh sách dài. Sau đó, nhấn phím w trên bàn phím của bạn. Kết quả là:

?- sudoku([_,_,2,3,_,_,_,_,_,_,_,_,3,4,_,_], Solution); true. 
Solution = [4, 1, 2, 3, 2, 3, 4, 1, 1|...] [write] 
Solution = [4, 1, 2, 3, 2, 3, 4, 1, 1, 2, 3, 4, 3, 4, 1, 2] ; 
true. 
+0

IMO câu trả lời này lặp đi lặp lại những cái cũ của CapelliC và Boris ... hoặc tôi đã bỏ lỡ một cái gì đó? – repeat

+0

Tôi nghĩ bạn có thể đúng. Tôi đã không nhận thấy họ đã ở đây cả rồi. –

3

Nếu bạn đang tìm cho mình sử dụng string_codes/2 hoặc atom_codes/2 rất nhiều, xem xét lại cách tiếp cận của bạn. Bạn có thể sử dụng chars thay cho codes và tránh toàn bộ chuỗi dữ liệu chuỗi SWI cụ thể. Tất cả điều này, bằng cách đặt cờ Prolog:

?- set_prolog_flag(double_quotes, chars). 
true. 

?- Chs = "Codes are unreadable!". 
Chs = ['C', o, d, e, s, ' ', a, r, e|...]. 

Điều này dễ đọc hơn [67, 111, 100, 101, 115, 32, 97, 114, 101|...] nhưng vẫn không giải quyết được sự cố của bạn.Tuy nhiên, bây giờ bạn có thể hiển thị các câu trả lời như vậy gọn gàng bằng cách sử dụng library(double_quotes).

?- use_module(double_quotes). 
true. 

?- Chs = "Codes are unreadable!". 
Chs = "Codes are unreadable!". 

?- Chs = "Codes are unreadable", Chs = [C|Chs2]. 
Chs = "Codes are unreadable", 
C = 'C', 
Chs2 = "odes are unreadable". 

Với cài đặt này, bạn có thể xử lý văn bản thuận tiện hơn nhiều. Nó cũng phù hợp với DCG.

0

Bạn có thể giải quyết câu hỏi của bạn với điều này,

?- set_prolog_flag(answer_write_options,[max_depth(0)]). 
true. 

Tuy nhiên, nếu bạn có kế hoạch để luôn hiển thị tất cả các kết quả và không được lọt vào danh sách, sau đó bạn có thể thêm dòng này trong "init".

Navigation: SWI-Prolog> Cài đặt> Người dùng init file

Bạn sẽ được yêu cầu tạo một tập tin swipl.ini nếu bạn chưa bao giờ tạo ra một.

Vào cuối ngày, bạn sẽ không cần phải nhập mã dòng ở trên khi bạn bắt đầu lại prolog trong tương lai.

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