Prolog でまったり

このエントリーをはてなブックマークに追加
>>930
,
932デフォルトの名無しさん:04/07/09 18:36
2000年に生まれたスレなので記念カキコ
?-ぬるぽ.
ガッ
no
|
課題でProlog使うことになったんだが、なんだこれは。
Cとかしかやったことないから、なんだか新鮮だよ。
よし、勉強してくる!
936デフォルトの名無しさん:04/09/11 00:18:47
ところでprologってさ・・・何が出来るの?
身近で活躍しているprologのプログラムって何かあるのかな?
937デフォルトの名無しさん:04/09/13 09:20:08
>>936
SQL
938デフォルトの名無しさん:04/09/13 10:17:20
>>937
???
939デフォルトの名無しさん:04/09/13 11:49:40
 test
940デフォルトの名無しさん:04/09/13 11:50:00
test 
941デフォルトの名無しさん:04/09/13 11:50:42
 test
942デフォルトの名無しさん:04/09/13 11:52:18
test 
>>936
お前の身近ってどこよ? (w

あんまりないんじゃない?
アルゴリズムが固まってしまうと、解探索を言語に依存しないで、
他の言語で自分で書いた方が速くなるから。
アルゴリズムの研究する時は便利だけども。
944774:04/09/17 15:33:38
BPrologにおいて、Cのincludeでbprolog.hを要求されるのですが、
どこにもありません。
どこかに落ちているものなんでしょうか。
945デフォルトの名無しさん:04/09/22 10:03:59
誰か助けてください!両替の問題を解いてください.
?- ryougae([24, 11, 3], 27, X).とすると
X=[1, 0, 1]
X=[0, 0, 9] 
と答える述語を書いてください.
prolog始めて3週間で出た学校の課題です><;
946デフォルトの名無しさん:04/09/22 10:32:56
宿題は自分でやらないと意味ないよ。
947デフォルトの名無しさん:04/09/23 19:33:19
ryougae([24, 11, 3], 27, [1, 0, 1]).
ryougae([24, 11, 3], 27, [0, 0, 9]).
948デフォルトの名無しさん:04/10/06 14:58:45
変数の中身がスペースで区切られたものをリスト化することが出来る関数は無い?
A = 'a b c d e'

B = [a,b,c,d,e]
みたいに。
949デフォルトの名無しさん:04/10/06 16:07:49
あげ
950デフォルトの名無しさん:04/10/06 20:14:36
とても素人っぽいsplit。

split(A, B) :- name(A, X), split2(X, B, []).

split2([], [], []) :- !.
split2([], [D], C) :- !, name(D, C).
split2([32|T], R, []) :- !, split2(T, R, []).
split2([32|T], [D|R], C) :- !, name(D, C), split2(T, R, []).
split2([H|T], R, C) :- !, append(C, [H], D), split2(T, R, D).

玄人のスマートな解答を希望。
951デフォルトの名無しさん:04/10/08 19:48:38
Prologを始めたばかりなんですが、今悩んでる問題があります。

【問題】
3点(X1,Y1), (X2,Y2), (X3,Y3)の座標が与えられたとき,その3点を直線で結ぶと三角形になるという
関係san(X1/Y1, X2/Y2, X3/Y3)がある。

?- san(0/0,4/0,4/3). → yes
?- san(0/0,5/5,3/3). → no

という問題です。
座標の位置関係を記述することができればいいのではないかと考えているのですが、
分かりません。
誰か解いてもらえませんか?お願いしますm(_ _)m
952デフォルトの名無しさん:04/10/08 20:58:38
三角形にならない場合を考えよう。
それは3点が一直線上にあるときのみ。3点が一直線にあるなら、
一つの点から別の2点へ向かう2つのベクトルが張る面積がゼロ。
つまり内積がゼロ。

っていう論理をPrologの節にエンコードすればいいじゃんか。
953デフォルトの名無しさん:04/10/08 21:12:53
triangle_ineq(A, B, C) :- A + B > C.
distance(X1, Y1, X2, Y2, D) :- D is sqrt((X1 - X2) ** 2 + (Y1 - Y2) ** 2).
is_triangle(X1, Y1, X2, Y2, X3, Y3) :-
distance(X1, Y1, X2, Y2, A),
distance(X2, Y2, X3, Y3, B),
distance(X3, Y3, X1, Y1, C),
triangle_ineq(A, B, C),
triangle_ineq(B, C, A),
triangle_ineq(C, A, B).

ところで、
> 関係san(X1/Y1, X2/Y2, X3/Y3)がある。
ここのスラッシュはどういう意味?
954デフォルトの名無しさん:04/10/08 22:03:58
>>952
なるほど。内積を使うのか。
目から鱗というか、気づかなかった自分が情けない。



…って。内積が0なら直角三角形じゃないですか。
外積だよね。
955デフォルトの名無しさん:04/10/11 03:31:50
>>953

> 関係san(X1/Y1, X2/Y2, X3/Y3)がある。
>ここのスラッシュはどういう意味?

951ではないが、レスする。

スラッシュは本来、変数間の除算を表す記法。
ただし、数式として評価しなければ、単なる
データ構造を構成する記号の中間記法になる。
X1/X2は /(X1,X2)と同じ。 Z is X1/X2とかすると除算を実行する。

このプログラムでは point(X1,X2)とかにした方がいいと思う。


956デフォルトの名無しさん:04/10/11 09:46:53
>>955
そういうことでしたか。
ありがとうございます。
957デフォルトの名無しさん:04/10/11 13:38:59
>>950
おお、動きました。
遅くなりましたがthx.
958デフォルトの名無しさん:04/10/17 21:52:07
>>948
> 変数の中身がスペースで区切られたものをリスト化
atom_chars/2 を使って、結果のリストからスペースの分を除くのはどう?
959デフォルトの名無しさん:04/10/24 21:44:45
今prologを実習してるんですけど全然わかりません
リストの辺りでボロボロです。
初心者はココを見ろ!的なHPありませんか?
960デフォルトの名無しさん:04/10/26 09:49:34
prologの前にLISPやっとけ
961デフォルトの名無しさん:04/11/01 23:47:02
初心者ですいません。
次のように二重になってるリストの中身を置換させる
述語の書き方がわかりません。

?-replace([a,[b,c],d],b,[e,f],X).
X=[a,[[e,f],c],d].

二重になってない場合ならわかったのですが…
その先にどうしても進めません。
どなたかよろしくお願いします。
962デフォルトの名無しさん:04/11/02 08:49:51
>>961
replace([],A,B,[]) :- !.
replace([A|T],A,B,[B|C2]) :- !, replace(T,A,B,C2).
replace([H|T],A,B,[C1|C2]) :- !, replace(H,A,B,C1), replace(T,A,B,C2).
replace(A,A,B,B) :- !.
replace(D,A,B,D) :- !.

とても雑なので,参考程度に.
963961:04/11/02 12:33:24
>>962
ありがとうございました!
964デフォルトの名無しさん:04/11/05 19:29:18

算術式を入力して、それが算術式かどうか判定するプログラムを作りたいのですが
うまくいきません。教えていただけないでしょうか?


aexp( 5+7*8 ).
yes
みたいなのを。
算術式は、とりあえず、整数と、変数の+,-,*を考えています。

/*自分がかんがえたもの */

aexp(X):-number(X)
aexp(X);-var(X).
aexp(X1*X2):-aexp(X1), aexp(X2).
aexp(X1+X2):-aexp(X1), aexp(X2).
aexp(X1-X2):-aexp(X1), aexp(X2).


965デフォルトの名無しさん:04/11/05 19:54:09
>>964
若干修正してみた。

aexp(X):-number(X).
aexp(X):-atom(X).
aexp(X1*X2):-aexp(X1), aexp(X2).
aexp(X1+X2):-aexp(X1), aexp(X2).
aexp(X1-X2):-aexp(X1), aexp(X2).
966デフォルトの名無しさん:04/11/05 21:49:41
すばいやい、回答ありがとうございます。
967デフォルトの名無しさん:04/11/11 23:50:41
Prolog ではまったり
968デフォルトの名無しさん:04/11/12 17:24:50
member(X,[X|Y]).
member(X,[Y|Z]) :- member(X,Z).

remove(X,[X|Rest],Rest).
remove(X,[Y|Rest],[Y|L]):- remove(X,Rest,L).

member(),remove使って、setsubst(L1,L2,L3)
L2のリスト要素から、L1のリスト要素を取り除いた結果がL3
という述語ってどう書けばいいのでしょうか?
969デフォルトの名無しさん:04/11/12 19:24:54
setsubst([],L,L) :- !.
setsubst([H|T],L2,L4) :- member(H,L2),remove(H,L2,L3),setsubst([H|T],L3,L4),!.
setsubst([_|T],L2,L3) :- setsubst(T,L2,L3),!.

効率が良いかはわからないが、指定通りmember,removeを使ってみた。
970968:04/11/12 19:47:50
!があまりよくわかってないので、!の使いどころでハマッってました。
あとで、試してみます。
ありがとうございました。
971968:04/11/13 14:54:32
setsubst([1,2],X,[3,4])を実行したところ、無限ループになってしまいました。
setsubst([f(X,Y),f(Z,W)],[f(a,b),f(c,d),g(e,f),f(i,j)], Result).
では、Result=[f(a,b),g(e,f)], [f(c,d),g(e,f)], [g(e,f),f(i,j)]
という結果を期待したのですが、一通りしか返ってきませんでした。
うーむ、どうすればいいのやら。。。
972デフォルトの名無しさん:04/11/14 00:15:31
>>971
複数の解を期待するなら、 cut しちゃだめでしょ。
973デフォルトの名無しさん:04/11/15 20:54:16
[[7,1],[7,2],[7,3],[6,1],[6,2],[6,3],[5,1],[5,2],[5,3],[4,1],[4,2],[4,3],
[3,1],[3,2],[3,3],[2,1],[2,2],[2,3],[0,1],[0,2],[0,3]]

というリストがあるのですが、これを

@[[0,1],[2,1],[2,2],[2,3],[3,1],[3,2],[3,3],[0,2],[4,1],[4,2],[4,3],
 [5,1],[5,2],[5,3],[0,3],[6,1],[6,2],[6,3],[7,1],[7,2],[7,3]]

という順序にしたいのです。

A[[0,1],[0,2],[0,3],[2,1],[2,2],…,[7,2],[7,3]]

という場合は、クイックソートの考え方で並べ替えることができました。
しかし、@の場合だと…
どなたかよろしくお願いします。
974デフォルトの名無しさん:04/11/15 21:17:54
意味がわからない
975デフォルトの名無しさん:04/11/16 09:51:22
語彙解析
 単語の品詞と意味の表を用意し、スペースで区切られた単語列
を一行読み込み、各単語にその品詞名と意味を付けたリストにする
プログラムを教えてください
976デフォルトの名無しさん:04/11/16 17:00:58
語彙解析(_文字列,_辞書付き語彙ならび):-
  atom_chars(_文字列,_文字ならび),
  辞書付き語彙ならび(_文字ならび,_辞書付き語彙ならび).
辞書付き語彙ならび([],[]) :- !.
辞書付き語彙ならび([A|R],R2):-
  区切り文字(A),
  辞書付き語彙ならび(R,R2),!.
辞書付き語彙ならび([A|R],[[_語彙,_品詞,_語意]|R2]) :-
  区切り文字(A),
  辞書付き語彙ならび(R,R2),!.
辞書付き語彙ならび([A|R],[[_語彙,_品詞,_語意]|R2]) :-
  \+(区切り文字(A)),
  語彙の切り取り([A|R],_語彙の文字ならび,R3),
  concat_atom(_語彙の文字ならび,_語彙),
  辞書(_語彙,_品詞,_語意),辞書付き語彙ならび(R3,R2),!.
語彙の切り取り([],[],[]) :- !.
語彙の切り取り([A|R],[A|R2],R3) :-
    \+(区切り文字(A)),語彙の切り取り(R,R2,R3),!.
語彙の切り取り([A|R],[],R) :- 区切り文字(A),!.
区切り文字(' ').
辞書(prolog,[名詞],[みればわかるもの]).
辞書(run,[動詞],[歩くことと同義]).
語彙のリストを作り上げてから、改めて辞書引きするのが普通ですが
再帰的な述語の構造をはっきりさせるため、中に入れました。
977デフォルトの名無しさん:04/11/16 22:08:16
ごめんなさい。下のところ間違ってました。訂正。
辞書付き語彙ならび([A|R],R2) :-  /* ←ここです */
  区切り文字(A),
  辞書付き語彙ならび(R,R2),!.
辞書付き語彙ならび([A|R],[[_語彙,_品詞,_語意]|R2]) :-
  \+(区切り文字(A)),
  語彙の切り取り([A|R],_語彙の文字ならび,R3),
  concat_atom(_語彙の文字ならび,_語彙),
  辞書(_語彙,_品詞,_語意), /* ←改行入れました */
  辞書付き語彙ならび(R3,R2),!.
978折れ目も:04/11/17 00:37:51
979デフォルトの名無しさん:04/11/17 07:53:28
980デフォルトの名無しさん
>975 これでどうです。
語彙解析(_文字列,X):-atomic_length(X,Length),語彙解析(_文字列,1,1,0,Length,X).

語彙解析(_文字列,_,Start,W,Length,[]):-Start > Length,W=0,!.
語彙解析(_文字列,Start0,Start,W,Length,[[_語彙,_品詞,_語意]]):-
  Start > Length,W > 0,
  atom_part(_文字列,Start0,W,G),
  辞書(_語彙,_品詞,_語意),!.
語彙解析(_文字列,Start0,Start,W,Length,[[_語彙,_品詞,_語意]|R]):-
  atom_part(_文字列,Start,1,A),区切り文字(A),W>0,
  atom_part(_文字列,Start0,W,G),
  辞書(_語彙,_品詞,_語意),
  Start2 is Start+1,
  語彙解析(_文字列,Start2,Start2,0,Length,R),!.
語彙解析(_文字列,Start,Start,W,Length,X):-
  atom_part(_文字列,Start,1,A),
  区切り文字(A),W=0,
  Start2 is Start+1,
  語彙解析(_文字列,Start2,Start2,0,Length,X),!.
語彙解析(_文字列,Start0,Start,W,Length,X):-
  atom_part(_文字列,Start,1,A),
  \+(区切り文字(A)),
  Start2 is Start+1,W2 is W+1,
  語彙解析(_文字列,Start0,Start2,W2,Length,X),!.