Prologでまったり Part5 [無断転載禁止]©2ch.net

■ このスレッドは過去ログ倉庫に格納されています
2017/03/24(金) 14:51:42.44ID:ZNjVJLCP
過去スレ
Prologでまったり Part4
http://pc12.2ch.net/test/read.cgi/tech/1235561034/
Prologでまったり Part3
http://pc11.2ch.net/test/read.cgi/tech/1193354806/
PrologでまったりPart 2
http://pc11.2ch.net/test/read.cgi/tech/1102664221/
Prolog でまったり
http://pc5.2ch.net/test/read.cgi/tech/976462999/
33デフォルトの名無しさん
垢版 |
2017/04/13(木) 18:49:38.84ID:zFvhZDnr
>>32
findall/3の方のAです
2017/04/14(金) 18:45:04.44ID:Xi9X67bT
ファイルから行ならびを得る(_ファイル,_行ならび) :-
open(_ファイル,read,_入力),
findall(_項,(
repeat,(at_end_of_stream(_入力),close(_入力),!,fail;
行入力(_入力,_行))),_行ならび).

行入力(_入力,_行) :-
read_line_to_codes(_入力,_文字コードならび),
atom_codes(_行,_文字コードならび).
35デフォルトの名無しさん
垢版 |
2017/05/03(水) 22:12:53.29ID:jbhMxViH
The Art of Prolog が PDF で公開されてるのはいいんだけど、テキストデータは無いのかな……
tesseract-ocr でテキスト化してるけど結構大変だ。
36デフォルトの名無しさん
垢版 |
2017/06/13(火) 23:42:07.13ID:3xaVR795
メモリ128GBの環境で述語 foo/1 引数にユニークなアトムを生成して5億節を定義する。

?- between(1,500000000,N),
atom_number(A,N),
assertz(foo(A)),
N = 500000000.

これで110GBを費やした。一節の追加あたり実に220byteということになり、
想像以上に大きくなった。
3736
垢版 |
2017/06/13(火) 23:46:21.36ID:3xaVR795
処理系は SWI-Prologインタプリタ (64bit版)

アトムテーブルがハッシュで管理されているとして、こんなにメモリを消費
するものだろうか。
38デフォルトの名無しさん
垢版 |
2017/06/14(水) 20:28:21.72ID:/Jq2k2dd
SWI-Prologインタプリタ

一方、atomの生成をやめて、グローバルスタックにリストして整数を積む。

?- findall(N,between(1,500000000,N),L).

これだと1リスト要素ごとに24バイト消費する。
39デフォルトの名無しさん
垢版 |
2017/06/15(木) 06:08:36.12ID:OS4b1hKm
Microsolft Azure の一時間あたりの料金

G5: 32 コア, 448 GB RAM,6144GB ディスク, \1,044.276/時間

消費税込みで月間81万円くらい。
2017/06/15(木) 06:12:07.38ID:OS4b1hKm
448GBメモリを使うことができれば、
Prologのオンメモリデータベースで大企業でもかなりの部分がカバーできる。
ディスクストレージへのバックアップ時間など、課題もあるだろうが。
2017/06/15(木) 06:22:15.34ID:OS4b1hKm
% swipl -G445000M

?- findall(N,between(1,18000000000,N),L).

が可能だということ。
42デフォルトの名無しさん
垢版 |
2017/06/15(木) 06:41:01.44ID:SczZ9hH4
>>41
近い将来には1TBメモリ 100万/月になるだろう
そうなると、プログラム言語の中で最もその恩恵を受けるのはPrologということか
43デフォルトの名無しさん
垢版 |
2017/06/16(金) 06:18:01.36ID:Qm+kDu/O
>>36
% GNU Prolog 1.4.4 でやってみたよ。コードはこんなんでいい?

ps :- shell('ps p $PPID -O sz',_).

eat_memory( Start,End) :-
\+(( between( Start,End,N), number_atom( N,A), assertz( foo( A)), fail)).

main :-
os_version( OS), write( OS), nl,
ps,
eat_memory( 1,10000),
ps,
eat_memory( 10001,20000),
ps,
true.
44デフォルトの名無しさん
垢版 |
2017/06/16(金) 06:19:09.35ID:Qm+kDu/O
% 実行結果

| ?- main.
main.
Linux 3.16.0-4-amd64
PID SZ S TTY TIME COMMAND
2993 32177 S pts/3 00:00:00 /home/i/Downloads/gprolog-1.4.4/bin/gprolog
PID SZ S TTY TIME COMMAND
2993 32807 S pts/3 00:00:00 /home/i/Downloads/gprolog-1.4.4/bin/gprolog
PID SZ S TTY TIME COMMAND
2993 33466 S pts/3 00:00:01 /home/i/Downloads/gprolog-1.4.4/bin/gprolog

(1728 ms) yes
| ?-

% 65 くらいだね。SWI の実装は知らないが 3.5 倍くらいなら驚くほどではないと思う。
2017/06/16(金) 07:24:41.91ID:3eXmF8sI
>>39
>>40
>>42
クラウドだとコストかかりすぎだけど
オンメモリデータベースとしての用途は
将来的に今よりもっと出てきそうだね
46デフォルトの名無しさん
垢版 |
2017/06/16(金) 16:54:43.29ID:TakoXWt8
>>44
ありがとうございます。3.5倍だとして、ハッシュテーブル等の構築の仕方の
差でしょうか。
47デフォルトの名無しさん
垢版 |
2017/06/21(水) 20:47:56.02ID:v8ZlsGJ1
それにしても一億節になると一節の追加時間が二万分の一秒と極端に遅い。
ハッシュの重なりが1万通りくらい出てきて平均5000回リンクを辿ると
いうことか。
48デフォルトの名無しさん
垢版 |
2017/06/26(月) 14:25:30.75ID:1MBq+06J
Prologもインメモリデータベースとしてさらに進化するべき時期。
http://www.publickey1.jp/blog/17/intel_persistent_memory2018xeoncascade_lake.html
2017/06/26(月) 19:19:28.13ID:J+dCdevE
そこはHPEのThe Machineじゃないの?
2017/06/26(月) 20:39:09.17ID:1MBq+06J
これは凄いね
https://www.hpe.com/jp/ja/japan/newsroom/press-release/2017/051901.html
51デフォルトの名無しさん
垢版 |
2017/07/01(土) 13:39:49.52ID:yvgbUlYU
制約論理プログラミングってのでPrologの色んな弱点緩和されてるっぽい。
SWI-Prologにもclpfdなるライブラリで提供されてるらしいけど使ってる?
52デフォルトの名無しさん
垢版 |
2017/07/02(日) 06:07:25.30ID:b2F1GUNM
>>51
全く使っていない
53デフォルトの名無しさん
垢版 |
2017/07/02(日) 06:58:37.04ID:7x1CJ3Ta
GNU Prolog で制約論理プログラミングしてるよ。
ゼブラパズルに置き換えられる問題は世の中に結構ある。
54デフォルトの名無しさん
垢版 |
2017/07/03(月) 05:54:57.56ID:6QSWtKdI
Prologがメジャーに復帰するためにはもう少し生きたプログラムが
表面に出てこないと
55デフォルトの名無しさん
垢版 |
2017/07/03(月) 10:52:00.94ID:p/temOJb
それに尽きる
56デフォルトの名無しさん
垢版 |
2017/08/02(水) 11:00:33.21ID:AyM7Pnm7
>>48
これって、第四の受動素子「メモリスタ」を使った奴だね。
いずれはこれに置き換わっていくのかな・・・
2017/08/02(水) 12:36:37.86ID:E8GFzbft
Prologのサンプルみたいんだけど、これって他のOOP言語とかでもライブラリとして実装可能じゃない?
2017/08/02(水) 20:33:24.50ID:iKI4Roin
可能だよ
59デフォルトの名無しさん
垢版 |
2017/08/02(水) 20:40:47.00ID:E8GFzbft
じゃあprologを使うメリットって何?
いや、別にprologをdisりたい訳じゃないけどどういう言語なのかなと思って
2017/08/03(木) 04:03:02.89ID:WCischub
Prolog Programming for Artificial Intelligence (4th Edition)ってどうですか?
いい本なら買うつもりです
2017/08/03(木) 12:49:51.06ID:0ZfpTseB
>>59
Prolog専用の言語環境を使うメリットの話?
そりゃ他言語のライブラリより
餅は餅屋で機能が豊富だから
62デフォルトの名無しさん
垢版 |
2017/08/04(金) 03:49:13.37ID:kIgI5e6Z
>>3
関数型の次は論理型がくる
2017/08/05(土) 10:44:36.62ID:MSodZ/NA
中核派のほうに細々と生き残ってるよなあ
2017/08/06(日) 01:06:18.01ID:eutB4+go
中核派がPrologを使っていたとは。
革マル派はLispですか?
65デフォルトの名無しさん
垢版 |
2017/08/06(日) 11:05:55.46ID:peki0++3
赤軍は?
2017/08/06(日) 12:59:05.66ID:SmKvCm0C
>65

>赤軍は?

赤軍というのは、通常は旧ソ連の軍隊のこと。
赤軍合唱団というのもありますが、
あなたの言いたいのは、日本の「連合赤軍」のこと
でしょう?
2017/08/06(日) 17:35:57.36ID:Co8jByrZ
>>66
連合赤軍ではなく日本赤軍のことかもしれないぞ
テルアビブ空港で乱射後自爆した
2017/08/06(日) 17:42:40.12ID:D2MwPYUj
だから赤軍派?って言ったじゃねーか!
2017/08/07(月) 09:24:07.63ID:tdYEUDnr
>68

>65では、
>赤軍は?

と書いてあって、

赤軍派?

とは、書いてありませんが。
実は「派」の字は書いてあったのだが、
私が老眼の為に見えなかったのでしょうか。
2017/08/07(月) 20:15:00.51ID:y+tGiyqS
嫌味なマジレスw
2017/08/07(月) 20:50:47.72ID:9xNxBROd
Prologおじさん改めPrologおじいさんですね
72デフォルトの名無しさん
垢版 |
2017/10/25(水) 11:21:14.75ID:ozqNX1fD
ラズパイ上で動くPrologが既にあるのだが、どんなアプリが面白いだろうか
2017/12/21(木) 07:07:21.01ID:ewcS0SAQ
兎にも角にもアレクサ君と連携
74デフォルトの名無しさん
垢版 |
2017/12/21(木) 08:15:15.55ID:EOeEZWwX
Prologって型定義をしないけど型が全くないという訳ではない
アトム、アトミック、整数、浮動小数点数、リスト
だけどそれ以上に区別する気はない
75デフォルトの名無しさん
垢版 |
2017/12/21(木) 09:32:27.33ID:ewcS0SAQ
ラバパイではそういうわけにはいかないが最近の速いパソコンだとPrologの一つの単一化も
3ナノ秒以下で実行されるらしい
Prologは遅いからとかの言い訳は利かないのかも
2017/12/22(金) 23:29:19.91ID:6BLzPHcG
ラバパイじゃ遅そうだな
ラバだからな
2018/02/16(金) 06:41:22.56ID:W1XJdyx1
☆ 日本の、改憲を行いましょう。現在、衆議員と参議院の
両院で、改憲議員が3分の2を超えております。
『憲法改正国民投票法』、でググってみてください。国会の発議は
すでに可能です。平和は勝ち取るものです。お願い致します。☆☆
2018/03/23(金) 03:56:42.38ID:v4A1VyNI
・電通、企業の顧客対応を自動化・高度化する日本語AIサービス「Kiku-Hana」を開発
http://tech.nikkeibp.co.jp/it/atclact/activer/nkpr/RSP474948_22032018/

Prologの採用事例がまた一つ
79デフォルトの名無しさん
垢版 |
2018/03/23(金) 04:08:26.39ID:6jIYybpe
自然言語処理はPrologの得意分野だからな
2018/03/23(金) 18:09:31.47ID:Wi+5DRxB
自然言語処理が確率的な手法で進めば進むほど、Prologの出番が出てくる。
2018/05/01(火) 08:58:56.17ID:fTDqzH+p
法律の条文解釈をHaskellでやってるのは見た事あるけど、Prologって、そういうのも可能なんだろうか?
2018/05/02(水) 03:42:05.92ID:MIS1A4AD
日本の法律は厳密に定義されていない部分がわりにあってうまくいかないという話をどこかで読んだことあるな
実際の基準や閾値は判例見ないとわからなかったりとか
そういうあいまいなところを実情に合わせて柔軟に解釈して運用することで時代の変化にある程度追従していけるようにしてあるのかも
2018/05/23(水) 08:30:56.56ID:PUSKgIep
憲法解釈でやりたい放題なんだから今さら
84デフォルトの名無しさん
垢版 |
2018/05/23(水) 20:04:35.28ID:Au5e7VGg
僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』

E5JQH
85デフォルトの名無しさん
垢版 |
2018/07/05(木) 01:36:48.58ID:RfoszcD2
Z7K
86デフォルトの名無しさん
垢版 |
2018/11/05(月) 10:15:56.17ID:j3sHpoUt
WikipediaのPrologの記載にある種の執念を感じた(笑)
2018/11/05(月) 14:32:06.16ID:JsuzbYis
>86
あれはまだまだ序文にすぎないよ
プロローグだけに
2018/11/06(火) 08:41:11.47ID:CZhh9Cm6
>87
座布団一枚!
89デフォルトの名無しさん
垢版 |
2018/11/11(日) 14:34:03.14ID:vUUak6BF
http://r2.upup.be/wV2qsULdHm
90デフォルトの名無しさん
垢版 |
2018/11/11(日) 17:51:52.84ID:96wp+TZd
NGゆき
2019/02/05(火) 17:47:02.82ID:sCQhaZP1
TwitterでPrologがちょっと燃えててワラタ
92デフォルトの名無しさん
垢版 |
2019/02/26(火) 20:00:32.82ID:W0wJxBNy
yarnに採用!おめでとう!
https://jser.info/2019/02/26/yarn-v2berryfastify-v2tslint/
また、ワークスペースの改善としてConstraintsというProlog(実際にはtau-prolog)を使った制約を扱うプラグインが追加されています。ワークスペース間の依存などのルールをPrologを使って記述して、より効率的に扱えるようにするのが目的のようです。

>>91
くやしく。
2019/02/27(水) 02:39:32.99ID:uWJyq6/U
パッケージ管理やビルドツールにPrologを使うというのは(Prologを使える人が少ないという点を除けば)極めて良いアイデアだと思う
94デフォルトの名無しさん
垢版 |
2019/02/27(水) 02:48:11.64ID:WT+xSYik
なんで今まで誰もやらなかったのかね
95デフォルトの名無しさん
垢版 |
2019/02/27(水) 12:50:03.80ID:+TCpifLa
makeで足りてるから
96デフォルトの名無しさん
垢版 |
2019/03/06(水) 18:36:48.48ID:fBh61pOJ
Prologでリストを使わない人はいないと思うのだけれど、
引数の部分にリスト以外の複合項を全く書かない人もいる。一方、引数に終始、複合項や式が
出続ける書き手もいる。
もちろん、対象領域が違うからという理由が大きいのだけれど、そのことは少し軽く見て、
そういう視点で観察してプログラマを分類してみるのも面白い。
2019/03/08(金) 22:49:07.51ID:NeLzfZqe
Prologの本はいっぱいあるけど、GHC系言語の解説書ってないのかなぁ。
あれでどんなプログラミングができるのかいまいちイメージがつかめない。
2019/03/08(金) 23:01:46.51ID:meEyRQaU
>>97
結局、これはいい、という適用分野が見つからなかった
2019/03/08(金) 23:23:02.60ID:3HgW2fRj
>>97
30年以上前のしか知らない
https://www.amazon.co.jp/dp/4320022661
読んだことないし
2019/03/08(金) 23:25:00.97ID:NeLzfZqe
そうなんだ?
Prologを踏まえて作られたものだから少なくともそれよりは利点があるものと思ったけど。
2019/03/08(金) 23:25:55.60ID:NeLzfZqe
>>99
あ、あるんだね。ありがとう。
2019/03/09(土) 00:15:35.43ID:/409IHbE
並行論理プログラミング言語 GHC / KL1 - Kazunori Ueda - 早稲田大学
http://www.ueda.info.waseda.ac.jp/~ueda/readings/GHC-intro.pdf

GHCの考案者による解説
103デフォルトの名無しさん
垢版 |
2019/04/17(水) 08:44:19.08ID:28onwIaH
>>40
SSDだと遅い?
104デフォルトの名無しさん
垢版 |
2019/06/07(金) 12:04:24.13ID:Vw8dl1xl
>>96
私は アトム+リスト 派だな。RDBの影響からか構造体は書かない。
105デフォルトの名無しさん
垢版 |
2019/06/10(月) 16:41:53.47ID:JdO3de0t
'1文字ずつ交互に1つの文字配列に格納し'(_文字列_1,_文字列_2,_文字数,_文字ならび) :-
findall(_文字,一文字ずつ交互に(_文字列_1,_文字列_2,_文字数,_文字),_文字ならび).

一文字ずつ交互に(_文字列_1,_文字列_2,_文字数,_文字) :-
between(0,_文字数,N),
交互に(_文字列_1,_文字列_2,N,_文字).

交互に(_文字列_1,_文字列_2,N,_文字) :-
sub_atom(_文字列_1,N,1,_,_文字).
交互に(_文字列_1,_文字列_2,N,_文字) :-
sub_atom(_文字列_2,N,1,_,_文字).
106デフォルトの名無しさん
垢版 |
2019/07/01(月) 21:23:07.04ID:VvtU1+Ac
% 今日書いたプログラム

solve( _,0,New,New) :-
!.

solve( [],_,_,_) :-
!, fail.

solve( [_|T],R,B,New) :-
solve( T,R,B,New).

solve( [H|_],R,_,_) :-
R < H,
% write( R-H),nl,
!, fail.

solve( [H|T],R,B,New) :-
RN is R - H,
% write( RN-[H|B]),nl,
solve( T,RN,[H|B],New).

main :-
Elem = [9729,8895,8572,7627,6576,6460,5842,5496,5467,2921,1685,511],
solve( Elem,31178,[],New),
write( New),nl,
true.
2020/03/05(木) 19:56:08.14ID:h922Dn8C
>>86
あれメチャクチャ詳しくて助かるわ!
自治厨に消されるかもしれないから
ページをローカルに保存してあるぞ
2020/05/20(水) 07:32:13.18ID:fGOoG/D2
Prologこんなところでも実用されてたのね
https://robotstart.info/2020/05/19/heart-conditioner-top.html
109デフォルトの名無しさん
垢版 |
2020/05/20(水) 09:33:08.57ID:Dfazl3Af
朝日新聞x電通=0
110デフォルトの名無しさん
垢版 |
2020/05/21(木) 10:05:05.65ID:p6Pkr9q+
AZ-Prologですね
111デフォルトの名無しさん
垢版 |
2020/05/21(木) 10:25:23.25ID:p6Pkr9q+
>>105
これ間違っていますね。_文字数の意味が今ひとつ不明ですが多分、

'1文字ずつ交互に1つの文字配列に格納し'(_文字列_1,_文字列_2,_文字数,_文字ならび) :-
_文字数_1 is _文字数 - 1,
findall(_文字,一文字ずつ交互に(_文字列_1,_文字列_2,_文字数_1,_文字),_文字ならび).

でないといけません。
112デフォルトの名無しさん
垢版 |
2020/06/05(金) 03:01:05.09ID:p2r1F5vv
Prologで文脈自由文法が出来ると聞いてやってきた
情報求む

簡単にオートマトン書けるし良い言語だな
2020/06/05(金) 23:08:38.31ID:d3cW9y/k
W. F. Clocksin/C.S. Mellish著、中村克彦訳
『Prologプログラミング』(日本コンピュータ協会刊行)

「第9章 文法規則の使用」
には、文脈自由文法をPrologで実現する方法が解説されて
いますl
114デフォルトの名無しさん
垢版 |
2020/06/06(土) 00:52:50.14ID:P2ph+/53
>>113
情報サンクス!

Prologって知れば知るほど面白い言語だな
オートマトンもコンパイラも簡潔に書ける
乗り換え案内的なヤツもすぐ作れそうなのに配列の最大値を求めるとかは他の言語の方が楽に書けそうだな
特定のジャンルのアルゴリズム特化型言語か

独自のアレンジ加えたくて、今、swi-prolog本体のソース読み始めて分かったことは、
visibility("hidden")のattributeが設定されてるからソース書き換えないとinstrument-functionsを使った関数トレースが出来ない
C言語で15万行(ステップ数)ぐらい
qlfとかいう超高速読み込み可能な中間コードを生成してる
PL_next_solution()からVMの処理が始まるかも(違ったらスマン)
ぐらいかな
2020/06/20(土) 16:50:18.23ID:s+0TrQkE
時代がようやくPrologに追い付いてきた。
飛躍の環境が整いつつある。
2020/09/15(火) 14:31:15.52ID:aWAWrZMP
帰納論理プログラミングってプログラムの入出力の正しい例と不正解の例をあたえて機械学習でプログラムを作るはなしでいいんだよね?
最近のニューラルネットワークから影響受けた進歩はどんなのがあるの?
決定木を作りたい分野?だからあまり影響うけてないのかな。
2020/11/13(金) 21:40:55.37ID:YvL+uxnX
Tabled Prologって何ですか?何が凄いの?
118デフォルトの名無しさん
垢版 |
2020/11/20(金) 20:30:34.02ID:kpOgVe3q
>>117
フィボナッチ数列の定義で40番目前後で、計算できなくなっていた定義に、
途中で計算できた値を動的に asserta((fib(N) :- !)) してしまうと途端に巨大な
フィボナッチ数列を生成できるようになる。この場合は自分でassertaしているが
それを処理系が全ての目標に対して、結果を書留め、その結果を優先して利用する。
Prologの速度の遅さを改善し、深さ優先探索では計算不能の場合でも解が得られる
ケースがある。
2020/11/20(金) 21:17:41.49ID:YhokOqrJ
全然わからない…うわーん
2020/11/23(月) 02:51:39.97ID:XIoHPhIo
miniKanrenのcondeとかcondaとかconduとか用語の名前つけの意味が分からん。
どっかに書いてあるの?
てかこんな変な略語にする意味あるの??学びにくい
2020/11/25(水) 10:47:14.62ID:m/dxKoiX
>>118

> >>117
> フィボナッチ数列の定義で40番目前後で、計算できなくなっていた定義に、
> 途中で計算できた値を動的に asserta((fib(N) :- !)) してしまうと途端に巨大な
> フィボナッチ数列を生成できるようになる。この場合は自分でassertaしているが
> それを処理系が全ての目標に対して、結果を書留め、その結果を優先して利用する。
> Prologの速度の遅さを改善し、深さ優先探索では計算不能の場合でも解が得られる
> ケースがある。
副作用がある述語を含んだ述語はメモ化しないとかするん?
122デフォルトの名無しさん
垢版 |
2021/02/04(木) 08:23:36.35ID:JjBI2OlW
>>121
確かに、解がその時その時で変わる目標もあるので、そのことをどう見抜くのだろうか
123デフォルトの名無しさん
垢版 |
2021/05/21(金) 17:21:50.55ID:ZyYdcxQO
要素位置が同じ(_n番目,L1,L2,L1のn番目,L2のn番目) :-
要素位置が同じ(1,_n番目,L1,L2,L1のn番目,L2のn番目).

要素位置が同じ(N,_n番目,[A|_],[B|_],A,B).
要素位置が同じ(M,_n番目,[_|R1],[_|R2],A,B) :-
succ(M,N),
要素位置が同じ(N,_n番目,R1,R2,A,B).
124デフォルトの名無しさん
垢版 |
2021/05/21(金) 17:34:04.02ID:ZyYdcxQO
% 遅いですが、これでも同じ結果がでます。

要素位置が同じ(_n番目,L1,L2,L1のn番目,L2のn番目) :-
nth1(_n番目,L1,L1のn番目),
nth1(_n番目,L2,L2のn番目).
125デフォルトの名無しさん
垢版 |
2021/05/22(土) 04:06:27.31ID:EzA/TCTS
Prologでは非決定性の述語に書いていくというのが普通です。

春の七草(セリ).
春の七草(ナズナ).
春の七草(ゴギョウ).
春の七草(ハコベラ).
春の七草(ホトケノザ).
春の七草(スズナ).
春の七草(スズシロ).

この春の七草/1という述語は非決定性です。
つまり、所謂データベースは非決定性述語だということになります。
126デフォルトの名無しさん
垢版 |
2021/05/22(土) 06:37:34.55ID:EzA/TCTS
'春の七草の名前の中に「スズ」が入るのは'(_名前の中にスズが入る春の七草) :-
春の七草(_名前の中にスズが入る春の七草),
sub_atom(_名前の中にスズが入る春の七草,_,_,_,スズ).

のように検索します。sub_atom/5の第二、第三、第四引数はそれぞれ
匿名変数になっていますが、ここは本来
第二引数 : 変位
第三引数 : 文字数
第四引数 : 残り文字数
が来るところです。この検索ではこの情報は必要がないから匿名変数にしてあります。
127デフォルトの名無しさん
垢版 |
2021/05/22(土) 06:58:50.79ID:EzA/TCTS
'春の七草の名前の中に「スズ」が入るのは'(_名前の中にスズが入る春の七草) :-
春の七草(_春の七草),
sub_atom(_春の七草,_,_,_,スズ),
_春の七草 = _名前の中にスズが入る春の七草.

% この方が良いという意見もある。私は >>126 で構わないと思いますが。
128デフォルトの名無しさん
垢版 |
2021/05/22(土) 10:57:31.66ID:EzA/TCTS
Prologで項を読み込む時は read や read_term を使うけれど、syntax errorにならないように気を使わなくてはならず、さらに最後にピリオドが必要だったりであまり使われない。
SWI-Prologでは文の読み取りは read_line_to_string/2 が主に使われるようだ。

?- read_line_to_string(current_input,S).

とかやると、プロンプトが出てきて、入力可能になる。アルファベットと認識できる文字なら空白があろうとビリオドがあろうと全体がストリングとして読み取られる。
129デフォルトの名無しさん
垢版 |
2021/05/22(土) 11:35:44.08ID:EzA/TCTS
さて、read_line_to_string/2の第二引数にはStringが来る。このString。少々ヘンである。

?- read_line_to_string(current_input,X),name(Y,X).
|: 山下
X = "山下",
Y = 山下.

?- name(山下,X).
X = [23665, 19979].

?- read_line_to_string(current_input,[23665,19979]).
|: 山下
false.

?-
伝統的にnameの第二引数にStringが来ると第一引数には対応するアトムが単一化される。確かそうなっているようだが、これをread_line_to_stringの第二引数にもってくるとfalse.となる。
130デフォルトの名無しさん
垢版 |
2021/05/22(土) 11:43:12.26ID:EzA/TCTS
もう少しやってみると

?- read_line_to_string(current_input,X),X = [97,98].
|: ab
false.

?- "ab" = [97,98].
false.

?- name(X,"ab").
X = ab.

?-
name/2とは第二引数にStringと文字コードリストが入り得る仕様のようだ。
それではなぜ第一引数にアトムがくると文字コードリストが選択されるのか。
双方向性の述語の仕様として異様である。
131デフォルトの名無しさん
垢版 |
2021/05/22(土) 11:54:49.12ID:EzA/TCTS
実際には、Stringであるかatomであるかはほとんど気にせず使っている。理由は、

?- read_line_to_string(current_input,S),sub_atom(S,0,1,_,X).
|: 山下
S = "山下",
X = 山.

のようにsub_atom/5やatom_concat/3を介すると自動的にatomに変換されてしまう。
ほとんどの文字列処理ではこれらの組込述語を使うことになるためStringとatomについて心配する必要がない。
ただし、
?- read_line_to_string(current_input,S),assertz(S).
|: 山下
これはエラーになる。Stringを述語名に持ってくることはできない。
132デフォルトの名無しさん
垢版 |
2021/05/24(月) 13:39:16.27ID:pTUv/8tK
>>131
?- read_line_to_string(current_input,S),string_to_atom(S,A),assertz(A).
のようにアトムに変換する述語を介すれば定義可能。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況