Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Prolog

 Prolog

Daiki Matsunaga

December 10, 2017
Tweet

More Decks by Daiki Matsunaga

Other Decks in Programming

Transcript

  1. 1
    Prolog

    View Slide

  2. 2
    Prologとは

    論理型プログラミング言語
    – 「Prologプログラムは命題、実行は命題の証明過程」で
    あるとみなせる

    「Haskellが数学だとすれば, Prologは国語だ」

    View Slide

  3. 3
    サザ○さん
    %事実
    親子(ふね,サザエ).
    親子(ふね,カツオ).
    親子(ふね,ワカメ).
    親子(サザエ,タラオ).
    %規則
    兄弟(X,Y) :­ 親子(Z,X), 親子(Z,Y), X\==Y.
    %­­­ここまでをファイルに記述し、Prolog処理系にロードする
    %質問
    ?­ 親子(ふね,X).
    X = サザエ ;
    X = カツオ ;
    X = ワカメ
    ?­ 兄弟(カツオ,ワカメ).
    yes.
    ?­ 兄弟(タラオ,ワカメ).
    no.

    View Slide

  4. 4
    地図を塗り分ける
    different(red,green). different(red,blue).
    different(green,red). different(green,blue).
    different(blue,red). different(blue,green).
    coloring(Hyogo,Kyoto,Shiga,Nara,Osaka,Wakayama) :­
    different(Hyogo,Kyoto), …… , different(Osaka,Wakayama).
    ?­ coloring(Hyogo,Kyoto,Shiga,Nara,Osaka,Wakayama).
    Hyogo = red  Kyoto = green
    Shiga = red  Nara = red
    Osaka = blue  Wakayama = green
    ;
    Hyogo = red Kyoto = green
    Shiga = blue Nara = red
    Osaka = blue Wakayama = green
    (...以下省略)

    View Slide

  5. 5
    append
    %リストを連結
    append([], Xs, Xs).
    append([X | Ls], Ys, [X | Zs]) :­ append(Ls, Ys, Zs).
    %質問
    ?­ append([1,2],[3,4,5],X).
    X = [1,2,3,4,5]
    yes.
    ?­ append([1,2],X,[1,2,3,4,5]).
    X = [3,4,5]
    yes.
    ?­ append(X,Y,[a,b,c]).
    X = NIL
    Y = [a,b,c]
    ;
    X = [a]
    Y = [b,c]
    ;
    X = [a,b]
    Y = [c]
    ;
    X = [a,b,c]
    Y = NIL

    View Slide

  6. 6
    Prologの動作

    合致する節がなければ失敗

    合致する節があり、その副目標もすべて成功すれ
    ば、成功

    節の意味
    – A :- B, C, D.

    「B かつ C かつ D が真なら A は真」(命題として見る)

    「サブルーチンAは文B, C, Dを逐次実行」(手続き的な見方)

    Prologの実行は深さ優先探索と見ることもできる

    View Slide

  7. 7
    単一化(ユニフィケーション)

    Prologの変数
    – Prologの変数ははじめ未束縛(アンバウンド)
    – 一度代入されると値は変えられない

    『合致する』というのは項同士の単一化(ユニフィケーショ
    ン)で調べる
    – 単一化は2つの項を等しくしようとする操作
    – 未束縛変数と値の単一化は、変数への代入
    – 未束縛変数同士の単一化は、2つの変数を同一視
    – 親子(ふね, サザエ) と 親子(ふね, X)を単一化

    Xにサザエが代入される(Xは未束縛だとする)
    – 親子(ふね, サザエ) と 親子(波平, サザエ)の単一化

    失敗する

    双方向性
    – appendの例では、3つの引数うちどれを変数にしてもうごいた

    View Slide

  8. 8
    バックトラック

    Prologの大きな特徴

    もし目標が失敗したら
    – いったん巻き戻して、別の候補を探しに行く
    – それまでの変数への代入はなかったことにされる

    非決定性
    – 解が複数
    – バックトラックのおかげで、親子(ふね,X) は3つの解を持

    View Slide

  9. 9
    Warren's Abstract Machine (WAM)

    Prologプログラムを効率よく動かすために考えられたアーキテクチャ
    switch­on­term L2,L1,L5,FAIL
    L1: switch­on­constant {[] L3}

    L2: try­me­else L5
    L3: get­constant [],A1
    get­value X2,A3
    proceed
    L4: trust­me
    L5: get­list A1
    unify­variable X4
    unify­variable X1
    get­list A3
    unify­value X4
    unify­variable X3
    execute append/3
    %append(
    % [],
    % Xs, Xs
    %).
    %append(
    % [
    % X |
    % Ls], Ys,
    % [
    % X |
    % Zs]) :­
    %append(Ls, Ys, Zs).
    append/3をWAMの命令列にコンパイルした結果

    View Slide

  10. 10
    参考文献

    Prolog(Wikipedia)
    – https://ja.wikipedia.org/wiki/Prolog

    Prologを使ってみる
    – http://www.takeoka.org/~take/ailabo/prolog/prolog-prol
    ogue.html

    7つの言語 7つの世界(Bruce.A.Tate, オーム社)

    wambook
    – http://wambook.sourceforge.net/

    AN ABSTRACT PROLOG INSTRUCTION SET(和訳)
    – http://www.takeoka.org/~take/ailabo/prolog/wam/wam.h
    tml

    View Slide