【論理】Prolog【初心者】
レス数が1000を超えています。これ以上書き込みはできません。
>>950
ありがとうございます。なるほど1行でハロワ書けるんですか、でもそれでゲームのNPCにどうやって自然言語処理するのに使うんでしょうか?
プログラムなんて変数配列とif分岐とfor繰り返しでほぼ全て出来てると聞きましたけど、
それとは違うなんかデータの塊のような
Prolog ってヘンテコな変わったプログラミング言語なんですね。
六法全書読み込んで判例教えたら判決が出力されるんですか?
>>951
MySQLとかPythonのプロンプトような感じでしょうか?
コンソールで問い合わせて答えを得る的な基本CUI?
データベースのようなデータベースと違うようなイライザのようなチャット?
クエリー?エキスパートシステムの雛形?
第一引数にファイル渡すと読み込むんでしょ?
これはコマンドラインで引数渡して戻り値を取得する見たいに出来ないんですかね?
HTMLのActiveXからJScriptで受け取ったりとか if と for を使う、普通のプログラミング言語としても使えるよ
if は違うゴール節に入る
for はすべて再帰で書く
それだけのこと 言語を作った人達ですらappendの意味を理解できなかったらしいからな。 Prologを使ったアイデアがいっぱい出てくる
機械学習の可能性に疑問を持ち始めた今こそコレだ!って感じがする笑
これからのテーマは「機械学習じゃ出来ないことをPrologでやろう」だな
因果関係とか戦略的意志決定とか胸が熱くなるんだが笑 >>955
http://www.iluminado.jp/
その辺のシンボリックAIは80年代、90年代前半に色々検証されてBRMSに名前を変えて残っている。
結局、ブラックボックスになってメンテができないとか、データの精度がとか今の機械学習とおんなじ過ちを30
年前もやっている。 >>956
なるほどBRMSか
JBoss BRMSとかいうのを調べたがWebとか色んな分野で使われててかなり面白そうだな
結局、Prologの立ち位置としてはそういうのとか他の色んなアルゴリズムの教育用途に適してるかもって思ったわ
簡潔に書けるし、アルゴリズムの教育に持って来いだな
小学校でヴィジュアルプログラミングとかやってる場合じゃねぇ!w >>957
俺はロジカルシンキングの代わりに頭の中でPrologを動かしているw。
オブジェクト指向と同じ、ある種の試行訓練やな。 iZ-Cのサンプルプログラム書き始めたので見てね。
sunasunax.hatenablog.com A: Dはうそつきです
B: AとDのどちらかは本当のことを言っています
C: Bの言っていることは本当です
D: 私はうそつきではありません
正直者は必ず本当のことを言っています。
うそつきは必ずうそをつきます。
うそつきはいったい誰?
↑この問題って高階述語になるから一階述語論理しか扱えないPrologでは解けないって理解でいいの?
そうだとしたら現代ではコンピューターでどうやって解くの? >>962
実装選ぶ必要ありますか?どれでも可能? よく分からんけど高階論理は不要で、制約論理で解けるんじゃないか
https://www.swi-prolog.org/pldoc/man?section=clpb
Aの発言は Aが真ならDは偽、Aが偽ならDは真という制約になり、これは A=:=(~D) と表せる
Bの発言は B=:=(A+D)、Cの発言は C=:=B、Dの発言は D=:=D と表せる
まとめると ?- sat((A=:=(~D)) * (B=:=(A+D)) * (C=:=B) * (D=:=D)). となり答は
B = C, C = 1, sat(A=\=D). となる
これはBとCは正直、AとDのうち一人は正直でもう一人は嘘つきだけどどちらが嘘つきかは分からないということ ありがとうございます
文章題からこの制約を書き下せる自信がない…(|||´Д`) >>965
正直者は必ず本当のことを言い、うそつきは必ずうそをつくという条件があるので
Aが正直者であるかどうかとAが言っていることが正しいかどうかの真偽は同じになるということで、それを制約論理の式で表すだけ
A=:=(~D)は、A(Aが正直者であること)と(~D)(Aの発言内容「Dは嘘つきだ」)の真偽が一致している(=:=)ということ
Aが真なら(~D)も真だし、Aが偽なら(~D)も偽
他の3人についても同様
これをリンク先にある制約論理で表す
0 偽
1 真
~P not P
P*Q P and Q
P+Q P or Q
P=<Q PならばQ
P=:=Q PとQの真偽は同じ
P=\=Q PとQの真偽は異なる 制約論理を使わない(使えない)場合はどうしたらいいんだろ
d:-d.なんて書いても無限ループになるだけだし >>961-967
こういうのとか
s(A,B,C,D) :-
( A=true; A=false),
( B=true; B=false),
( C=true; C=false),
( D=true; D=false),
( A=true -> D=false ; true),
( A=false -> D=true ; true),
( B=true -> (A=true ; D=true); true) ,
( B=false -> A=false,D=false ; true),
C=B.
考え方は>>966と同じ
>正直者は必ず本当のことを言い、うそつきは必ずうそをつくという条件があるので
>Aが正直者であるかどうかとAが言っていることが正しいかどうかの真偽は同じになる
SWI-Prologで実行したら解は2つ
A = B, B = C, C = true, D = false
A,B,Cが正直者でDが嘘つき
A = false, B = C, C = D, D = true
Aが嘘つきでB,C,Dが正直者
これと同じだな
>これはBとCは正直、AとDのうち一人は正直でもう一人は嘘つきだけど
>どちらが嘘つきかは分からない >>968
変えてみた
s2(A,B,C,D) :-
( A=true; A=false),
( B=true; B=false),
( C=true; C=false),
( D=true; D=false),
( A -> D=false ; D=true),
( B -> (A=true ; D=true) ; A=false,D=false),
C=B. >>969
変えてみた
s3(A,B,C,D) :-
Boolean=[true,false],
( member(A, Boolean)),
( member(B, Boolean)),
( member(C, Boolean)),
( member(D, Boolean)),
( A -> D=false ; D=true),
( B -> (A=true ; D=true) ; A=false,D=false),
C=B. >>961
R. Smullyanのto mock a mocking birdの前編はこういう問題の宝庫でおすすめ
多分最も影響力のある論理学の啓蒙書だから釈迦に説法かもしれんが
公務員試験でもあるな、これくらいなら表書けば解ける、多分 表を書いてみる
s4 :-
writeln("A B C D"),
writeln(""),
Boolean=[true,false],
forall(
( ( member(A,Boolean)),
( member(B,Boolean)),
( member(C,Boolean)),
( member(D,Boolean))),
( ( A->write("T ");write("F ")),
( B->write("T ");write("F ")),
( C->write("T ");write("F ")),
( D->write("T ");write("F ")),
( ( A -> D=false ; D=true),
( B -> (A=true ; D=true) ; A=false,D=false),
C=B
-> writeln("○")
; writeln("×")))). このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 4556日 7時間 59分 56秒 5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/
▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php レス数が1000を超えています。これ以上書き込みはできません。