【論理】Prolog【初心者】
レス数が950を超えています。1000を超えると書き込みができなくなります。
>>846
atom_concatつかうのはどうですか?
9 ?- readln(X),X=[First|[Rest]],atom_concat(First,Rest,Out).
|: abc def
X = [abc, def],
First = abc,
Rest = def,
Out = abcdef. >>851
ありがとうございます。
基本的にそれでうまく行くことも多いのだけれど、
入力したままの文字列にならないという点で具合が悪い。空白が必ずひとつならば、
atomic_list_concat(X,' ',Out),
良いのだが、そうとは限らない。 >>849
分かりやすいドキュメントは重要だよな
>>850
論理プログラミングに持ち込める問題なら
非常に簡潔に書ける >>850
他の言語には難しい表現が可能になるから。 Lispの演習でユニフィケーションを実装すると、Prologがクセになる
マジおすすめ 昨日ツイッターで出てきた。
即是(色,空).
という定義。これひとつで、
空 色
即 即
是 是
色 空
を満たしているのではないかと。 Tiobe Index for January 2017 Very Long Term History
Programming Language 2017 2012 2007 2002 1997 1992 1987
Java 1 1 1 2 17 - -
C 2 2 2 1 1 1 1
C++ 3 3 3 3 2 2 4
C# 4 4 6 10 - - -
Python 5 7 7 16 27 - -
PHP 6 5 4 6 - - -
JavaScript 7 9 8 7 20 - -
Visual Basic .NET 8 24 - - - - -
Perl 9 8 5 4 3 - -
Assembly language 10 - - - - - -
Lisp 28 12 12 9 7 11 2
Ada 30 15 16 15 10 3 13
Prolog 33 43 27 27 14 9 3
Prologもメジャーだった。 >>847
?- readln(X).
|: 愛情
X = [愛,情].
% というように、マルチバイト文字が分解されてしまう。これは直すべきだろう。 >>845
Prologがメジャーな時代からこの点は変わりなかった。
つまり、Prologからすると、扱うのは項であり、項になり得ないものを
入力対象とすることを潔しとしなかった。
>>858 これはもう、
行入力(_行) :- readline_to_codes(current_input,X),atom_codes(_行,Codes).
を定義してしまった方がよい。 ごめんなさい。
行入力(_行) :- readline_to_codes(current_input,Codes),atom_codes(_行,Codes).
です。 >>859 >>860
すみません。これ、
行入力(_行) :- read_line_to_codes(current_input,Codes),atom_codes(_行,Codes).
だと思います。readline_ではなくて、read_line_です。それから、一般化して
行入力(_入力ストリーム,_行) :- read_line_to_codes(_入力ストリーム,Codes),atom_codes(_行,Codes).
としておいた方が、ライブラリ化するのなら良いと思います。 >>861
ありがとうございます。うっかりしました。
それからライブラリの話はストリーム明記となしの両方を作る必要がありますね。 ところで、
『Prologでまったり』スレ
復活したいですね。 Alephなどの帰納論理ライブラリ使ってる方はいるんだろうか。話聞いてみたい。 >>864
私はProgolを使いこなせなかった。それ以来はこの方面は手を出していない。
AlephはPrologで書かれているライブラリなのかな。 >>859
read_line_to_string/2 というのもありますね。
普通どちらを使うものだろうか。 最近Stringが使われているコードあまり見なくなりましたね。
関数名、述語名もアトムですから。アトムとして処理したいです。
sub_atom/5やatom_concat/3が強力であることもあって、文字コードが
出る幕はなくなったということでしょう。
read_line・・・ については何故かどちらも文字コードが来るのですが。 read_line_to_chars/2でよいと思うのですが何故_to_codesしかないのでしょうか。 なぜ、Prologの世界で、これを標準ライブラリ化しなかったのか。
そのことの理解が必要なんだろうけれど。以下はどうしても必要だろう。
行入力(_入力ストリーム,_行) :-
read_line_to_code(_入力ストリーム,Codes),
atom_codes(_行,Codes). >>865
はい、Alephはprologで書かれています。
http://www.cs.ox.ac.uk/activities/machinelearning/Aleph/aleph
自分は「Prolog Programming for Artificial Intelligence 4th Edition」の
Inductive Logic Programing(帰納論理プログラミング)の記事を読んで興味を持ったのですが、
この本で紹介されているコードを大分レベルアップしたのがAlephやProgolのように感じました。
自分もまだ勉強中ですが、例えば以下の問題など興味深いです。
has_daughter述語の学習
parent(X,Y):XはYの親、 female(X):Xは女性、という既存の述語があったとして、
has_daughter(X)というボディ部不明の述語があり、
これを満たす例、満たさない例をたくさん与えると、
has_daughterのボディ部の内容の仮定を生成する
列車のeastbound-westbound問題(有名な問題のようです)
これこれの構成で積荷がこれこれの列車は東行き、これこれだと西行きという事例を沢山学習させ、
任意の構成の列車を入力するとそれが西行きか東行きかを生成した仮定を用いて判定する >>865
ちょっと遅くなりました。帰納論理プログラミングについては、魅力的ですし、
将来、重要な地歩を占めるものと、予感しています。Progolについては、
大量に現れる節の可能性を上手く排除できず、中断状態になったままです。
この機会にAlephやってみます。どうも有難うございました。 まちがえました。自分を指してしまった。
>>870 でした。 >>873
自分はProlog大好きなのですが全然流行っていないような…情報集めもメッチャ苦労しますし…
Prologの基本文法以外の、論文とかでしかあまり目にしない「応用Prolog」みたいな領域があって「日本ではあまり目立たなかったけど実は少しづつ進化していた」というのはあると思います。
日本語で目にするPrologの基本文法レベルの情報と外国で見つかる応用Prologの情報には大分差があるというのはあると思います。
文法にも大分手が入っている印象です >>873
どっかの大学で処理系作る演習課題を出したのでは Prologって、第5世代コンピュータをつくるとかいって、ICOTという組織を
作って大々的に研究していたのじゃなかったかな。
ICOTの成果というものは、発表さいているのかしら。 >>877-878
プロジェクトの遺産であるKLICはメンテナンスされている。
並行論理プログラミング (KLIC version 3.01)
http://www.ueda.info.waseda.ac.jp/software-j.html
けいえるわん
http://www.ueda.info.waseda.ac.jp/~takagi/kl1/
並列論理型言語処理系 KLIC のページ
http://web.archive.org/web/20100815015107/http://www.klic.org/software/klic/index.ja.html
第五世代コンピュータ プロジェクト アーカイブ
http://web.archive.org/web/20150121033015/http://www.jipdec.or.jp/archives/icot/ARCHIVE/HomePage-J.html >>878
>>879
情報ありがとうございます。 残念…
https://ja.wikipedia.org/wiki/Prolog
>Prolog にオブジェクト指向プログラミングを取り入れた ESP
(略)
>ESPは多重継承を特徴とする当時としては先鋭のオブジェクト指向言語であった
(略)
>ISO の標準化作業は1987年頃から作業委員会(WG17)が作られ、
>日本委員も情報処理学会から15名ほどがこれに加わった。
(略)
>モジュール仕様については日本委員から、ICOTによって作成された
>ESP(Extended Self-contained Prolog)を以てその標準とする案が出されていたが、
>これは否決された。 今のままでは、小学校のプログラミング教育にScratchが導入されてしまう。
Prologを推すことができるように、
小学生の目線で書いたPrologプログラムを増やそう。 基本的な方針としては、
道具立てなく、現在の授業科目の中ですぐに利用できるプログラム言語で
あることを武器として、広めていく。
もちろん、環境整備は必要だし、Prologの言語仕様の一部変更も必要には
なるだろう。 >>873
人工知能ブームで波及効果があるんじゃね?
でも読み書きしにくいから
Pythonみたいにメジャーにはならないと思うけど >>886
現在の深層学習は人間が結果に責任を持ちにくいというような欠陥があって、
それを補う部分の記述では必要。その部分では最有力ということではないか。 訂正。
・・・・・・・
それを補う部分の記述が必要。その部分では最有力ということではないか。 >>886
読み書きしにくいの意味が、データの入出力のことなら別だけれど
プログラムの読みやすさ、書きやすさの意味だとすると、
Prologはもっとも読みやすいプログラム言語のひとつではないか
書く方は、難しいという見方もできるだろうが >>887
その部分では関数型言語も手続型言語もオブジェクト指向が強調されたものでも記述できるが、その記述の簡潔さでは、Prologは一頭地抜けている >>890
そろそろ
「ニューラルネットワーク的AIを制御するためのPrologプログラミング」
というような本がほしい。密かにやっているような段階ではない。 「ニューラルネットワーク的AIを統制するためのPrologプログラミング」かな。 Emacsでプログラム書いてますか?設定の参考になるサイトとかないでしょうか Prologでデータベース foo/1 の引数値を集約するときに
?- findall(N,foo(N),L),sum_list(N,Sum).
というように書きます。これを
?- findall(Sum_1,(
findnsols(1000,N,foo(N),L1),
sum_list(L1,Sum_1)),L2),
sum_list(L2,Sum).
というように書くとスタックの消費を抑えることがてきます。 >>892
AI的な課題のものでもよいし、そうでなくてもよいから
PythonとPrologの連携コード集がほしい そうそうProlog読み書きしにくいから
基本はPythonメインで
論理プログラムがハマるところに
Prolog使いたいよね
でも連携というかそもそも
Prolog自体の情報が少ない 人工知能ということになるとPrologは述語論理を担うなどと大仰な
ことになるが、もっと単純に、
自分はこういうことを望む。
これこれのことはするな。
というように比較的単純なしかしどうしても欠かせない情報を
確実に表現するためのもの。Pythonよりさらに簡素な記述系を
最大限に使い込もう。 実行系をさらにその上位で制御するという役割にPrologのようなプログラム言語は当てられてよいはずだが<
案外とそういうコードがない。GeneXusなどもそういう切り口を残すべきだったのだろうけれど、現在のところそうなっていない。 Prologは宣言型なので
Pythonなどの命令型言語よりさらに高水準だから
システム最上位の制御にふさわしい……
って理屈は分かるけど
実際にはそういう使われ方で普及してないよね?
関数型言語よりもっと簡潔だけどもっと難しいんじゃ
やっぱ日常的に使いにくいんだと思う >>896
ディープラーニンングは一過性ではなく持続しそうだから今後益々
数値計算依存部分はPytho、シンボル依存部分はPrologの切り分けが
進む。メインはPrologではあるが、スクリプト的なものが多くなる。 >>900
PrologとPythonなどとの連携部分はまだ課題が多い。
単に呼べるというのでは不十分で、「簡単にどのライブラリ間でもいじること無く呼べる」必要がある。
例えば、C++がいま一つ敬遠される理由はこの連携が弱い(ABIが乱立)からだし。
まあこの手の問題は、糊(glue)機能が比較的優れてるLispでも抱えてる問題ではあるが。 僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』
26K6I prolog初心者でわからないことあったから来てみたけどもしかして誰もいない? >918
そのわからないことを質問してみたらいいのじゃないかな >920
構文木を例のように見やすくするプログラムを書きたいんだけどそれがわからなく、
ggっても全然出てこなくて困ってる
例
文(
主語(
名詞句(
名詞句(
名詞(鳥))
主格助詞(は)))
述語(
目的語(
名詞句(
形容詞(白い)
名詞句(
名詞(花))))
対象格助詞(を)
動詞(好む))) >920
連投ごめんなさい 構文木ってのがこれ 構文木じゃなくて構文木を表す項っていうのかな
文(主語(名詞句(名詞(鳥),主格助詞(は))),述語(目的語(名詞句(形容詞(白い)名詞(花)),対象格助詞(を))),動詞(好む))). Welcome to SWI-Prolog (Multi-threaded, 32 bits, Version 6.6.6)
?- [user].
|: 死ぬ(人間).
|: member(ソクラテス, 人間).
|: % user://1 compiled 0.00 sec, 3 clauses
true.
?- 死ぬ(ソクラテス).
false.
なんでtrueにならないんでしょ? 最近Prologを学び始めたのですが、ゴール(目標)について質問があります。教えてください
例えばwikipedia<https://ja.wikipedia.org/wiki/Prolog>などで、
> 目標 = ( 副目標1,副目標2, ... 副目標n ) と置けば、
> 頭部 :- 目標.
というような説明になっているのですが、
『Prologへの入門』だと、
> システムへの質問は1つまたは複数の目標(goal)から成る.
> parent( X, ann), parent( X, pat)
> のような目標の列は
> XがAnnの親であり、かつXがPatの親である
> という目標の連言(conjunction)を意味する.
となってますし、The Art of Prologでも
> An important extension to the queries discussed so far is conjunctive
> queries. Conjunctive queries are a conjunction of goals posed as a query,
> for example, f ather(terach,X) ,father(X,Y)? or in general, Q1, ..., Qn.
となっていて、一番上の引用における「副目標」のことをgola(目標)と呼んでいる
ように思われるのですが、私の理解が間違ってるのでしょうか
それとも、Prolog界で定義というか捉え方が変わったのでしょうか >>928
>となっていて、一番上の引用における「副目標」のことをgola(目標)と呼んでいる
あ、すいません、「goal(目標)と呼んでいる」の打ち間違いです >>928
goalのうち上位のgoalを構成してるgoalたちを
subgoalと呼んで分かりやすくしてるかどうかの違いでは? うーん 沢山のゴールの中の「上位」なものを「副」と名付けるとは思えませんが
「目標」が「goal」の訳だとすると、「目標」の上位なものを「副目標」と呼び、副目標の並びを
また「目標」と呼ぶということになってしまいます >>931
書き方が悪かったかな
上位のgoalを構成する部分要素になってるgoalをsubgoalと呼んでるってこと
subgoalもgoal。goalという概念のうち特化したものをsubgoalと呼んでる。
subを強調したいかどうかで書き手が使い分けてるだけ 確かに「goalを並べてもgoal」という定義はありだと思いますが、目標という言葉が
「副目標」がたくさん出現した後で「頭部 :- 目標.」で初めて出てくるのはどうなんだろうと
いう思いを禁じえません。。
ともあれ、ちょっとすっきりしました
ありがとうございました ひとつ前は去年のレスか……
このスレもゴールしそうだな? Prologを使えばオートマトンが簡単に実装出来るな
文法自由文法に相当することも出来るみたいだが詳しいことを教えてくれ
あと、Prologの文法を色々拡張しようと思ってswi-prolog本体のソースコードを読んでるから情報交換頼む swi-prolog本体のソース読んでるんだが
__cyg_profile_func_enter使ってswi-prologの関数トレースしようと思ったら出来ないなーと思ったらvisibility("hidden")のattributeが設定されてたw
取りあえず一括置換したわw
Prologって文法がシンプルだからインタープリターのソースも15万ステップぐらいしかないし、実用的な言語実装の勉強になる
さらに汎用言語と組み合わせて使えば構造化データのマッチングなんかで強力な武器になるしいい言語だな!
皆んなでインタープリターのソース読んでProlog広めようぜ! >>937
プロログの語源はプロローグじゃなくて
プログラミング・オブ・ロジックのフランス語だった気がする ボンジュールの仲間みたいなもんですか、
そいつは気が付きませんでした、レス有難う。
ところでこっちの質問もお願いします。
https://mevius.5ch.net/test/read.cgi/tech/1560333895/533 HTMLパーサの話題なんだけど、HTMLならウェブ系のスレかと思って書き込んだけど、レスが付かない。 考えられてはいたらしい
述語論理型プログラミング-EPILOGの提案-
https://dbnst.nii.ac.jp/pro/detail/716
本研究の成果に対して、情報処理学会は、1985年、
淵 一博((財)新世代コンピュータ技術開発機構)に
創立25周年記念論文賞を贈った。 >>942
あったんだw
論文読んでる途中だけどかなり勉強になるな
細かい理解はまだだけど。
そもそも確率的な揺らぎを認めない論理プログラミングにどこまで可能性があるか疑問だけどな
Prolog拡張するならそこだろって思うわ Prologが何かわからないので誘導されて
1レスから943レスまで目を回してみたけど
初心者向けなんですかここ?
何をどうするプログラムなのかが
ジャンルすら不明でまったく意味不明です。
まずPrologは何が何でPrologの
ハローワールドの実行方法を教えてください。 >>944
「論理プログラミング」で検索!
わからんなら忘れてしまえばいいのではないか?
「初心者」がわからなければならないようなものでもないしな。
ちなみに、オレもそこまでわからん。w てかPrologスレってもう一個あるんだけどどっちかに統一しないか?
ただでさえ人少ないのに2つもいらんだろ
↓こっちの方が人多そう
http://itest.5ch.net/mevius/test/read.cgi/tech/1490334702 今朝 7 時過ぎに某知恵袋にこんな投稿があった。
A : B は嘘つき
B : A か C が嘘つき
C : A が嘘つき
誰が嘘つきなのか調べるプログラムを書いてくれ
Prolog で書いてる間にこの投稿は削除された。
仕方ないからこっちに貼っておく。
evi_a( Liar) :- member( b/1, Liar).
evi_b( Liar) :- member( a/1, Liar) ; member( c/1, Liar).
evi_c( Liar) :- member( a/1, Liar).
p_evi( Liar,[]) :- write( Liar),nl.
p_evi( Liar,[P/Evi|T]) :-
G =.. [Evi,Liar],
( member( P/1, Liar) -> \+( G) ; G),
p_evi( Liar,T).
p_ml([]).
p_ml([[A,B,C]|T]) :-
Liar = [a/A,b/B,c/C],
( p_evi( Liar,[a/evi_a,b/evi_b,c/evi_c]) ; true ),
p_ml( T).
main :-
p_ml([[0,0,0],[0,0,1],[0,1,0],[0,1,1],[1,0,0],[1,0,1],[1,1,0],[1,1,1]]). >>945
は:ーい.忘れた:ー.
このスレは無かった:-存在しません.
記憶にございませんwというのは嘘つき?
>>947
?ABC:−大人はみ:ーんな大ウソつき Prologが何かわからないので誘導されて
1レスから943レスまで目を回してみたけど
初心者向けなんですかここ?
何をどうするプログラムなのかが
ジャンルすら不明でまったく意味不明です。
まずPrologは何が何でPrologの
ハローワールドの実行方法を教えてください。 :- writeln('hello world'),halt. >>949
knowledge base(=factとrule)を書いてそれに対してqueryを投げて答えを得る
そういうスタイルで書く言語
原理的にはパターンマッチとbacktrack
論理パズルや組み合わせ問題なんかは比較的簡単に書ける
(が他言語でsolverを使う場合に比べると遅いことが多い)
http://www.learnprolognow.org/lpnpage.php?pagetype=html&pageid=lpn-htmlse1
↑このチュートリアルを読みつつ
↓ここで試すといい
https://swish.swi-prolog.org/ レス数が950を超えています。1000を超えると書き込みができなくなります。