/* Parsing Japanese Sentence by Prolog */ % Prologでかんたんな日本語文を構文解析するプログラムです。 % nihongo.pl % date: 2009 Oct 1 % file format: UTF-8 % test: SWI-Prolog 5.6.52 :- op(800, xfy, 'が').% :- op(800, yfx, 'が'). % :- op(800, xfy, 'は'). %:- op(800, yfx, 'は'). % :- op(800, yf, 'です。'). :- op(800, yf, 'ではありません。'). :- op(700, xfx, 'の'). :- op(700, xfx, 'で'). :- op(700, xfx, 'に'). :- op(700, xfx, 'と'). %:- op(900, xf, '。'). s( 1, '太郎' 'は' '学生' 'です。'). s( 2, '太郎' 'は' '妹' 'が' '学生' 'です。'). s( 3, ('タマ' 'は' ('猫' 'です。'))). s( 4, 'タマ' 'は' ('学生' 'ではありません。')). s( 5, '花子' 'は' ('女性' 'です。')). s( 6, ('花子' 'は' ('猫' 'が' '好き' 'ではありません。'))). s( 7, '太郎' 'は' ('花子' 'が' (' 好み' 'の' '女性') 'です。')). s( 8, 'ゾウ' 'は' 'ハナ' 'が' ' 長い。'). s( 9, ('ゾウ' 'は' 'ハナ') 'が' ' 長い。'). s( 10, ('ゾウ' 'の' 'ハナ') 'が' ' 長い。'). s( 11, ('ゾウ' 'の' 'ハナ') 'は' ' 長い。'). s( 12, 'ゾウ' 'の' ('ハナ' 'は' ' 長い。')). s( 13, 'ゾウ' 'は' ('ハナ' 'が' ' 長い。')). s( 14, 'ゾウ' 'の' 'ハナ' 'は' ' 長い。'). s( 15, '太郎' 'は' ('花子' 'が' (' 好み' 'の' '男性') 'です。')). s( 16, '太郎' 'は' (('花子' 'が' ' 好み') 'の' '男性') 'です。')). % /* % がとは、共にxfyの場合 :- op(800, xfy, 'が'). :- op(800, xfy, 'は'). ERROR: d:/pl/gofai/nihongo.pl:34:0: Syntax error: Illegal start of term 34: s( 16, '太郎' 'は' (('花子' 'が' ' 好み') 'の' '男性') 'です。')). 127 ?- s(N,I),nl,write(N:I),fail. 1: (太郎 は 学生 です。) 2: (太郎 は 妹 が 学生 です。) 3: (タマ は 猫 です。) 4: (タマ は 学生 ではありません。) 5: (花子 は 女性 です。) 6: (花子 は 猫 が 好き ではありません。) 7: (太郎 は 花子 が 好み の 女性 です。) 8: (ゾウ は ハナ が 長い。) 9: ((ゾウ は ハナ)が 長い。) 10: (ゾウ の ハナ が 長い。) 11: (ゾウ の ハナ は 長い。) 12: (ゾウ の (ハナ は 長い。)) 13: (ゾウ は ハナ が 長い。) 14: (ゾウ の ハナ は 長い。) 15: (太郎 は 花子 が 好み の 男性 です。) false. % がとは、共にyfxの場合 :- op(800, yfx, 'が'). :- op(800, yfx, 'は'). 85 ?- [nihongo]. ERROR: d:/pl/gofai/nihongo.pl:19:0: Syntax error: Operator priority clash ERROR: d:/pl/gofai/nihongo.pl:20:0: Syntax error: Operator priority clash ERROR: d:/pl/gofai/nihongo.pl:25:0: Syntax error: Operator priority clash ERROR: d:/pl/gofai/nihongo.pl:33:0: Syntax error: Operator priority clash ERROR: d:/pl/gofai/nihongo.pl:34:0: Syntax error: Operator priority clash % nihongo compiled 0.00 sec, 36 bytes true. 19: s( 1, '太郎' 'は' '学生' 'です。'). 20: s( 2, '太郎' 'は' '妹' 'が' '学生' 'です。'). 25: s( 7, '太郎' 'は' ('花子' 'が' (' 好み' 'の' '女性') 'です。')). 33: s( 15, '太郎' 'は' ('花子' 'が' (' 好み' 'の' '男性') 'です。')). 34: s( 16, '太郎' 'は' (('花子' 'が' ' 好み') 'の' '男性') 'です。')). 97 ?- s(N,I),nl,write(N:I),fail. 3: (タマ は (猫 です。)) 4: (タマ は (学生 ではありません。)) 5: (花子 は (女性 です。)) 6: (花子 は (猫 が 好き ではありません。)) 8: (ゾウ は ハナ が 長い。) 9: (ゾウ は ハナ が 長い。) 10: (ゾウ の ハナ が 長い。) 11: (ゾウ の ハナ は 長い。) 12: (ゾウ の (ハナ は 長い。)) 13: (ゾウ は (ハナ が 長い。)) 14: (ゾウ の ハナ は 長い。) false. % はのみyfx :- op(800, yfx, 'は'). :- op(800, xfy, 'が'). ?- [nihongo]. ERROR: d:/pl/gofai/nihongo.pl:19:0: Syntax error: Operator priority clash ERROR: d:/pl/gofai/nihongo.pl:20:0: Syntax error: Operator priority clash ERROR: d:/pl/gofai/nihongo.pl:26:0: Syntax error: Operator priority clash ERROR: d:/pl/gofai/nihongo.pl:34:0: Syntax error: Operator priority clash % nihongo compiled 0.02 sec, 144 bytes true. 19: s( 1, '太郎' 'は' '学生' 'です。'). 20: s( 2, '太郎' 'は' '妹' 'が' '学生' 'です。'). 26: s( 8, 'ゾウ' 'は' 'ハナ' 'が' ' 長い。'). 34: s( 16, '太郎' 'は' (('花子' 'が' ' 好み') 'の' '男性') 'です。')). 112 ?- s(N,I),nl,write(N:I),fail. 3: (タマ は (猫 です。)) 4: (タマ は (学生 ではありません。)) 5: (花子 は (女性 です。)) 6: (花子 は (猫 が 好き ではありません。)) 7: (太郎 は (花子 が 好み の 女性 です。)) 9: ((ゾウ は ハナ)が 長い。) 10: ((ゾウ の ハナ)が 長い。) 11: (ゾウ の ハナ は 長い。) 12: (ゾウ の (ハナ は 長い。)) 13: (ゾウ は (ハナ が 長い。)) 14: (ゾウ の ハナ は 長い。) 15: (太郎 は (花子 が 好み の 男性 です。)) false. % がのみyfx :- op(800, yfx, 'が'). :- op(800, xfy, 'は'). ERROR: d:/pl/gofai/nihongo.pl:20:0: Syntax error: Operator priority clash ERROR: d:/pl/gofai/nihongo.pl:25:0: Syntax error: Operator priority clash ERROR: d:/pl/gofai/nihongo.pl:33:0: Syntax error: Operator priority clash ERROR: d:/pl/gofai/nihongo.pl:34:0: Syntax error: Illegal start of term % nihongo compiled 0.02 sec, -12 bytes 1: (太郎 は 学生 です。) 3: (タマ は 猫 です。) 4: (タマ は 学生 ではありません。) 5: (花子 は 女性 です。) 6: (花子 は 猫 が 好き ではありません。) 8: (ゾウ は ハナ が 長い。) 9: (ゾウ は ハナ が 長い。) 10: (ゾウ の ハナ が 長い。) 11: ((ゾウ の ハナ)は 長い。) 12: (ゾウ の (ハナ は 長い。)) 13: (ゾウ は ハナ が 長い。) 14: (ゾウ の ハナ は 長い。) false. % if op(700, xfx, 'の') 's priority level is depreciated to 800 % then 14th (ゾウ の ハナ は 長い。) (line 32) is no longer valid. ERROR: d:/pl/gofai/nihongo.pl:32:0: Syntax error: Operator priority clash */ % 以下 bun1.pl (2008)から修正して引用 % なおbun1.plはbun.pl (2006)をUTF-8 で保存しなおしたものです。 /* Japanese Sentence Generation 日本語文生成プログラム */ % Prologでかんたんな日本語文を生成するプログラムです。 sentence(S):-'文'(S). '文'(S):- '名詞'(N), '動詞'(V), S = (N 'が' V ). '文'(S):- '名詞'(N), '動詞句'(VP), S = (N 'が' VP). '文'(S):- '名詞句'(NP), '動詞句'(VP), S = (NP 'が' VP). '動詞句'(VP):- '名詞'(L, '場所'), '動詞'(V), VP = (L 'で' V). '動詞句'(VP):- '副詞'(ADV), '動詞'(V), VP = (ADV 'と' V). '名詞句'(NP):- '形容詞'(AD), '名詞'(N), NP = (AD - N). '動詞'('寝ている。'). '動詞'('歩いている。'). '名詞'('たろう'). '名詞'('じろう'). '名詞'('ベッド','場所'). '名詞'('公園','場所'). '副詞'('ゆっくり'). '副詞'('きびきび'). '形容詞'('疲れた'). '形容詞'('元気のいい'). %