LoginSignup
6
4

More than 3 years have passed since last update.

Prolog競プロ用チートシート

Last updated at Posted at 2020-04-11

この記事について

  • 学校で習った程度なので間違いがあるかもしれません。(あった場合は教えていただけると嬉しいです。)
  • 関係名, 変数名の名付けが適当です。
  • 文字列の入力が複数の場合はそのうち書きます。
  • 出力の部分もそのうち増やします。

入力

1行に1つ

そのまま変数へ

入力例:

1000

実装例:

get_input(Number):-
    current_input(Input),
    read_string(Input, '\n', '', _, String),
    number_string(Number, String).  % 文字列型なら必要ない

main:-
    get_input(N),
    write(N).

% 1000

リスト化

入力例:

1000

実装例:

get_input(Number):-
    current_input(Input),
    read_string(Input, '\n', '', _, String),
    number_string(Number, String).  % 文字列型なら必要ない

main:-
    get_input(N),
    number_chars(N, List),  % 文字列型なら string_chars(Str, List)
    write(List).

% [1,0,0,0]

1行に複数

別々の変数へ

入力例:

10 20

実装例:

get_input(Number):-
    current_input(Input),
    % 第二引数を ' \n' (スペースを含める)
    read_string(Input, ' \n', '', _, String),
    number_string(Number, String).  % 文字列型なら必要ない

main:-
    get_input(A),
    get_input(B),
    write(A),
    write(' '),
    write(B).

% 10 20

複数行(行数指定あり)

1行目に個数 2行目に個数個の入力 -> リスト

入力例:

3
10 20 30

実装例:

get_input(Number):-
    current_input(Input),
    read_string(Input, ' \n', '', _, String),
    number_string(Number, String).

get_numbers(0, []):- !.
get_numbers(N, [Number|L]):-
  N1 is N - 1,
  get_input(Number),
  get_numbers(N1, L).

main:-
    get_input(N),
    get_numbers(N, List),
    write(List).

% [10,20,30]

1行目に個数 2行目以降に個数個行の入力 -> リスト

入力例:

3
10
20
30

実装例:

get_input(Number):-
    current_input(Input),
    read_string(Input, '\n', '', _, String),
    number_string(Number, String).

get_some_inputs(0, []):- !.
get_some_inputs(N, [A|L]):-
    get_input(A),
    N1 is N - 1,
    get_some_inputs(N1, L).

main:-
    get_input(N),
    get_some_inputs(N, List),
    write(List).

% [10,20,30]

1行目で指定 1行に複数が複数行 -> リスト in リスト

入力例:

3 4
11 12 13 14
21 22 23 24
31 32 33 34

実装例:

get_input(Number):-
    current_input(Input),
    read_string(Input, ' \n', '', _, String),
    number_string(Number, String).

get_numbers(0, []):- !.
get_numbers(N, [Number|L]):-
  N1 is N - 1,
  get_input(Number),
  get_numbers(N1, L).

get_lists(0, _, []):- !.
get_lists(H, W, [T|L]):-
    get_numbers(W, T),
    H1 is H - 1,
    get_lists(H1, W, L).

main:-
    get_input(H),
    get_input(W),
    get_lists(H, W, List),
    write(List).

% [[11,12,13,14],[21,22,23,24],[31,32,33,34]]

出力

nl.           % 改行
write('\n').  % 改行
write('Yes'). % Yes
write(Count). % Countの内容

参考

とても参考にさせていただきました。素晴らしい記事ありがとうございます。
AtCoder に登録したら解くべき精選過去問 10 問を Prolog で解いてみた (@n4o847さん)
AtCoder に登録したら解くべき精選過去問 10 問を Prolog で提出してみた (@Mopepe51さん)

6
4
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4