8

次のように、文字列を ascii コードのリストに変換しようとしています。

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

8 ?- 

ご覧のとおり、これでリスト全体が得られるわけではありませんが、必要です。

この解決策は機能しません。答えが得られて完全に停止するため、wを押すことはできません。これもそうではありません。関数を問題なく呼び出すことができ、true が返されますが、リストはまだ完全に表示されていません。

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 ?- 

どんな助けでも大歓迎です!

4

5 に答える 5

11
?- 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].

SOのどこかに同じ答えがあるはずです...私はコンパイルしたばかりの最後のSWI-prologリリースを使用しています...

于 2015-10-02T15:42:20.267 に答える
4

string_codes/2または大量に使用していることに気付いた場合はatom_codes/2、アプローチを再考してください。SWI 固有の文字列データ型のchars代わりに使用して、完全に回避することができます。codesProlog フラグを設定することにより、これらすべてが実現します。

?- set_prolog_flag(double_quotes, chars).
true.

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

これは より読みやすいです[67, 111, 100, 101, 115, 32, 97, 114, 101|...]が、それでも問題は解決しません。しかし、 を使用してそのような回答をコンパクトに表示できるようになり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".

この設定により、テキストをより便利に処理できます。DCGとの相性も抜群です。

于 2016-05-07T11:59:19.457 に答える
2

@matによるコメントを回答に入れるだけです:

?- 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 */.

ただし、ここからすべての用語が完全に表示されます。これは面倒かもしれません。

また、印刷述語の 1 つを使用することもできます。

?- ..., writeln(Codes).

しかし、これは何らかの理由で眉をひそめています。回答で複数のバインディングが報告されているが、変数の 1 つの完全な値のみを確認したい場合、これは間違いなく便利です。

?- 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|...].
于 2015-10-03T08:13:51.920 に答える
0

私は2つの方法を見つけました。


1.

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

次に、切り捨てられたリストを出力するコマンドを実行します。

( set_prolog_flag ドキュメント)


2.

?- atom_chars(goodbye_prolog, X) ; true.

( AllOutput ドキュメント)

; true.長いリストになる呼び出しの最後に置きます。次にw、キーボードのキーを押します。結果は次のとおりです。

?- 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.
于 2016-04-29T23:20:59.220 に答える