ラベル Prolog の投稿を表示しています。 すべての投稿を表示
ラベル Prolog の投稿を表示しています。 すべての投稿を表示

2011年2月13日日曜日

Prologの技芸 12.4節の練習問題

(1)

edit :- edit(file([],[])). edit(File) :- write_prompt, read(Command), edit(File,Command). edit(File,exit) :- !. edit(File,Command) :- apply(Command,File,File1), !, edit(File1). edit(File,Command) :- writeln([Command,'is not applicable']), !, edit(File). apply(up,file([X|Xs],Ys),file(Xs,[X|Ys])). apply(up(N),file(Xs,Ys),file(Xs1,Ys1)) :- N > 0, up(N,Xs,Ys,Xs1,Ys1). apply(down,file(Xs,[Y|Ys]),file([Y|Xs],Ys)). apply(down(N),file(Xs,Ys),file(Xs1,Ys1)) :- N > 0, down(N,Xs,Ys,Xs1,Ys1). apply(insert(Line),file(Xs,Ys),file(Xs,[Line|Ys])). apply(delete,file(Xs,[Y|Ys]),file(Xs,Ys)). apply(delete(N),file(Xs,Ys),file(Xs1,Ys1)) :- N > 0, delete(N,Xs,Ys,Xs1,Ys1). apply(print,file([X|Xs],Ys),file([X|Xs],Ys)) :- writeln(X). apply(print(*),file(Xs,Ys),file(Xs,Ys)) :- reverse(Xs,Xs1), write_file(Xs1), write_file(Ys). apply(search(T), file([X|Xs],Ys), file(Xs1,Ys1)) :- search(Xs,T,N), apply(up(N),file([X|Xs],Ys),file(Xs1,Ys1)). apply(search(T), file(Xs,Ys), file(Xs1,Ys1)) :- search(Ys,T,N), apply(down(N),file(Xs,Ys),file(Xs1,Ys1)). apply(search(T), file([T|Xs],Ys), file([T|Xs],Ys)). apply(replace(S,T),file(Xs,Ys),file(Xs1,Ys1)) :- replace(Xs,Xs1,S,T), replace(Ys,Ys1,S,T). up(N,[],Ys,[],Ys). up(0,Xs,Ys,Xs,Ys). up(N,[X|Xs],Ys,Xs1,Ys1) :- N > 0, N1 is N-1, up(N1,Xs,[X|Ys],Xs1,Ys1). down(N,Xs,[],Xs,[]). down(0,Xs,Ys,Xs,Ys). down(N,Xs,[Y|Ys],Xs1,Ys1) :- N > 0, N1 is N-1, down(N1,[Y|Xs],Ys,Xs1,Ys1). delete(N,Xs,[],Xs,[]). delete(0,Xs,Ys,Xs,Ys). delete(N,Xs,[Y|Ys],Xs1,Ys1) :- N > 0, N1 is N-1, delete(N1,Xs,Ys,Xs1,Ys1). replace([],[],_,_). replace([X|Xs],[X|Ys],S,T) :- X \= S, replace(Xs,Ys,S,T). replace([S|Xs],[T|Ys],S,T) :- replace(Xs,Ys,S,T). search([X|Xs],X,1). search([X|Xs],Y,N) :- Y \= X, search(Xs,Y,M), N is M+1. write_file([X|Xs]) :- write(X), nl, write_file(Xs). write_file([]). write_prompt :- writeln('>>').

Prologの技芸 12.3節の練習問題

(1)

% nim(N,S) :- % 和がNで自分に回ってきたとき,Sと言えば勝てる. nim(N,S) :- between(1,3,S), N1 is N+S, lose(N1), !. :- dynamic win/1. :- dynamic lose/1. win(N) :- N =< 20, between(1,3,A), N1 is N+A, lemma(lose(N1)), !. lose(20). lose(N) :- N =< 20, N1 is N+1, N2 is N+2, N3 is N+3, lemma(win(N1)), lemma(win(N2)), lemma(win(N3)).

Prologの技芸 12.1節の練習問題

(1)

word_char(39). % アポストロフィ word_char(C) :- char_type(C, digit). end_of_words_char(C). :- char_code('?',C). end_of_words_char(C). :- char_code('!',C).

Prologの技芸 11.4節の練習問題

(1)

% substitute(Old,New,OldTerm,NewTerm) :- % NewTermは,OldTerm中のOldをNewに置き換えたものである. substitute(Old,New,Old,New) :- !. substitute(Old,New,Term,Term) :- atomic(Term), !. substitute(Old,New,Term,Term1) :- functor(Term,F,N), functor(Term1,F,N), substitute(N,Old,New,Term,Term1). substitute(N,Old,New,Term,Term1) :- N > 0, !, arg(N,Term,Arg), substitute(Old,New,Arg,Arg1), arg(N,Term1,Arg1), N1 is N-1, substitute(N1,Old,New,Term,Term1). substitute(0,Old,New,Term,Term1).

(2)

% select(X,Xs,Ys) :- % YsはリストXsの一番初めに出てきたXを % 削除したリストである. select(X,[X|Xs],Xs) :- !. select(X,[Y|Ys],[Y|Zs]) :- select(X,Ys,Zs).

Prologの技芸 11.3節の練習問題

(1)

X \== Y :- X == Y, !, fail. X \== Y.

(2)

nonvar(X) :- var(X), !, fail. nonvar(X).

Prologの技芸 11.1節の練習問題

(1)

% クイックソート % quicksort(Xs,Ys) :- % リストYsはリストXsの順序付けられた順列である. quicksort([X|Xs],Ys) :- partition(Xs,X,Littles,Bigs), quicksort(Littles,Ls), quicksort(Bigs,Bs), append(Ls,[X|Bs],Ys). quicksort([],[]). partition([X|Xs],Y,[X|Ls],Bs) :- X =< Y, !, partition(Xs,Y,Ls,Bs). partition([X|Xs],Y,Ls,[X|Bs]) :- X > Y, !, partition(Xs,Y,Ls,Bs). partition([],Y,[],[]).

(2)

% derivative(Expression,X,DifferentiatedExpression) :- % DifferentiatedExpressionは, % 式ExpressionのXに関する導関数である. constant(X) :- integer(X). constant(X) :- atom(X). derivative(X,_,0) :- constant(X), !. derivative(X,X,s(0)) :- !. derivative(X^N,X,N*X^M) :- integer(N), !, M is N-1. derivative(sin(X),X,cos(X)) :- !. derivative(cos(X),X,-sin(X)) :- !. derivative(e^X,X,e^X) :- !. derivative(log(X),X,1/X) :- !. derivative(F+G,X,DF+DG) :- !, derivative(F,X,DF), derivative(G,X,DG). derivative(F-G,X,DF-DG) :- !, derivative(F,X,DF), derivative(G,X,DG). derivative(F*G,X,F*DG+DF*G) :- !, derivative(F,X,DF), derivative(G,X,DG). derivative(1/F,X,-DF / (F*F)) :- !, derivative(F,X,DF). derivative(F/G,X,(G*DF-F*DG)/(G*G)) :- !, derivative(F,X,DF), derivative(G,X,DG).

(3)

% 挿入ソート % insertionsort(Xs,Ys) :- % リストYsはリストXsの順序付けられた順列である. insertionsort([X|Xs],Ys) :- !, insertionsort(Xs,Zs), insert(X,Zs,Ys). insertionsort([],[]). insert(X,[],[X]) :- !. insert(X,[Y|Ys],[Y|Zs]) :- X > Y, !, insert(X,Ys,Zs). insert(X,[Y|Ys],[X,Y|Ys]) :- X =< Y, !.

Prologの技芸 10.1節の練習問題

(1)

range(M,N,[M|Ns]) :- nonvar(M), nonvar(N), M < N, M1 is M+1, range(M1,N,Ns). range(M,N,[M|Ns]) :- nonvar(M), nonvar(Ns), M1 is M+1, range(M1,N,Ns). range(N,N,[N]).

(2)

plus(X,Y,Z) :- nonvar(Z), between(0,Z,X), Y is Z-X.

Prologの技芸 9.2節の練習問題

(1)

% occurrences(Sub,Term,N) :- % 項Term中の部分項Subの出現回数がNのとき真になる. occurrences(Term,Term,1) :- !. occurrences(Sub,Term,N) :- compound(Term), !, functor(Term,F,M), occurrences(M,Sub,Term,0,N). occurrences(Sub,Term,0). occurrences(M,Sub,Term,N1,N2) :- M > 0, !, arg(M,Term,Arg), occurrences(Sub,Arg,N), N3 is N+N1, M1 is M-1, occurrences(M1,Sub,Term,N3,N2). occurrences(0,Sub,Term,N,N).

(2)

% position(Subterm,Term,Position) :- % Positionは項Term中の部分項Subtermが占める % 引数位置のリストである. position(Term,Term,[]) :- !. position(Sub,Term,Path) :- compound(Term), functor(Term,F,N), position(N,Sub,Term,Path), !. position(N,Sub,Term,[N|Path]) :- arg(N,Term,Arg), position(Sub,Arg,Path). position(N,Sub,Term,Path) :- N > 1, N1 is N-1, position(N1,Sub,Term,Path).

(3)

% univ(Term,List) :- % Listは,Termの関数子と,その後ろに % Termの引数を連ねたものからなるリストである. univ(Term,[F|Args]) :- functor(Term,F,N), args(N,Term,Args,[]). args(N,Term,Xs,Ys) :- N > 0, N1 is N-1, arg(N,Term,Arg), args(N1,Term,Xs,[Arg|Ys]). args(0,Term,Xs,Xs).

(4)

% functor1(Term,F,Arity) :- % Termは,主関数子の名前がFで % 引数の数がArityであるような項である. functor1(Term,F,N) :- Term =.. [F|Args], length(Args,N). % arg1(N,Term,Arg) :- % Argは,項TermのN番目の引数である. arg1(N,Term,Arg) :- Term =.. [F|Args], retrieve(N,Args,Arg). retrieve(1,[X|Xs],X). retrieve(N,[X|Xs],Y) :- N > 1, N1 is N-1, retrieve(N1,Xs,Y).

(5)

% substitute(Old,New,OldTerm,NewTerm) :- % NewTermは,OldTerm中のOldをNewに置き換えたものである. substitute(Old,New,Old,New). substitute(Old,New,Term,Term) :- atomic(Term), Term \= Old. substitute(Old,New,Term,Term1) :- compound(Term), Term =.. [F|Args], substitute_args(Old,New,Args,Args1), Term1 =.. [F|Args1]. substitute_args(Old,New,[Arg|Args],[Arg1|Args1]) :- substitute(Old,New,Arg,Arg1), substitute_args(Old,New,Args,Args1). substitute_args(Old,New,[],[]).

Prologの技芸 9.1節の練習問題

(1)

% flatten(Xs,Ys) :- % YsはXsの要素のリストである. flatten(Xs,Ys) :- flatten(Xs,[],Ys). flatten([X|Xs],Zs,Ys) :- flatten(Xs,Zs,Ys1), flatten(X,Ys1,Ys). flatten(X,Xs,[X|Xs]) :- atomic(X), X \= []. flatten([],Xs,Xs).

2011年2月11日金曜日

Prologでanarchy golf 001 hello world

さて,久し振りの記事は,「Prologでショートコーディング」です.

Prologを少しずつやってはいるものの,入出力関係にはどうしても疎いままなので,演習がてらにやってみよう,というわけです.

まずは,Hello, world!から

anarchy golf - hello world

m:-write('Hello, world!').

とても簡単26B.anarchy golfでは,"m"という述語から実行されます.

2010年11月7日日曜日

Prologの技芸 8.3節の練習問題

(1)
% triangle(N,T) :-
% TはN番目の三角数である.
triangle(N,T) :- triangle(N,0,T).
triangle(N,Temp,T) :-
N<0, Temp1 is Temp+N, N1 is N-1, triangle(N1,Temp1,T).
triangle(0,T,T).

(2)
% power(X,N,V) :-
% VはXのN乗である.
power(X,N,V) :- power(X,N,1,V).
power(X,N,Temp,V) :-
N>0, Temp1 is Temp*X, N1 is N-1, power(X,N1,Temp1,V).
power(_,0,V,V).

(3)
% between(I,J,K) :-
% Kは,整数IとJの両端を含む区間内の整数である.
between(I,J,J) :- I=<J.
between(I,J,K) :-
I<J, J1 is J-1, between(I,J1,K).

(4)
% timeslist(IntegerList,Product) :-
% Productは整数のリストIntegerListの積である.
timeslist(Is,Pro) :- timeslist(Is,1,Pro).
timeslist([I|Is],Temp,Pro) :-
Temp1 is Temp*I, timeslist(Is,Temp1,Pro).
timeslist([],Pro,Pro).

(5)
% area(Chain,Area) :-
% Areaは,頂点のリストChainで囲まれた多角形の面積である.
% ただし,各頂点の座標は整数の対(X,Y)で表される.
area(XYs,Area) :- area(XYs,0,Area).
area([(X1,Y1),(X2,Y2)|XYs],Temp,Area) :-
Temp1 is Temp+(X1*Y2-Y1*X2)/2,
area([(X2,Y2)|XYs],Temp1,Area).
area([_],Area,Area).

(6)
% minimum(Xs,Min) :-
% Minは,整数のリストXsの要素の最小値である.
minimum([X|Xs],M) :- minimum(Xs,X,M).
minimum([X|Xs],Y,M) :- X=<Y, minimum(Xs,X,M).
minimum([X|Xs],Y,M) :- X >Y, minimum(Xs,Y,M).
minimum([],M,M).

(7)
% my_length(Xs,N) :-
% Nは,リストXsの長さである.
my_length(Xs,N) :- my_length(Xs,0,N).
my_length([_|Xs],Temp,N) :-
Temp1 is Temp+1, my_length(Xs,Temp1,N).
my_length([],N,N).

(8)
% range(M,N,Ns) :-
% Nsは,MとNを含む区間の整数のリストである.
range(M,N,Ns) :- range(M,N,[],Ns).
range(M,N,Xs,Ys) :-
M =< N, N1 is N-1, range(M,N1,[N|Xs],Ys).
range(M,N,Xs,Xs) :-
M > N.

Prologの技芸 8.2節の練習問題

(1)
% triangle(N,T) :-
% TはN番目の三角数である.
triangle(N,T) :-
N>0, N1 is N-1, triangle(N1,T1), T is T1+N.
triangle(0,0).

(2)
% power(X,N,V) :-
% VはXのN乗である.
power(X,N,V) :-
N>0, N1 is N-1, power(X,N1,V1), V is V1*X.
power(_,0,1).

Prologの技芸 7.5節の練習問題

(1)
% no_doubles(Xs,Ys) :-
% Ysは,リストXsから重複した要素を取り除いたリストである.
no_doubles(Xs,Ys) :- no_doubles(Xs,[],Ys).
no_doubles([X|Xs],Ys,Zs) :-
nonmember(X,Ys), no_doubles(Xs,[X|Ys],Zs).
no_doubles([X|Xs],Ys,Zs) :-
member(X,Ys), no_doubles(Xs,Ys,Zs).
no_doubles([],Xs,Xs).

Prologの技芸 7.3節の練習問題

(1)
sublist(Xs,AsXsBs) :-
append(As,XsBs,AsXsBs), append(Xs,Bs,XsBs).
% ゴールの順序を逆にすると,append(Xs,Bs,XsBs)が終わらない.
% sublist(Xs,[a,b,c])?を実行すると,
% append(Xs,Bs,XsBs)の引数は全て不完備リストになる.

(2)
% substitute(X,Y,L1,L2) :-
% L2はL1中に現れるすべてのXをYで置き換えた結果である.
substitute(X,Y,[],[]).
substitute(X,Y,[X|Xs],[Y|Ys]) :-
substitute(X,Y,Xs,Ys).
substitute(X,Y,[Z|Xs],[Z|Ys]) :-
X \= Z, substitute(X,Y,Xs,Ys).
ゴールの順序
%substitute(X,Y,[Z|Xs],[Z|Ys]) :-
X \= Z, substitute(X,Y,Xs,Ys).

%substitute(X,Y,[Z|Xs],[Z|Ys]) :-
substitute(X,Y,Xs,Ys), X \= Z.
とすると左方再帰になるため終わらなくなる.

Prologの技芸 7.2節の練習問題

(1)
prefix(Prefix,List)について
PrefixかListが完備なら停止する
suffix(Suffix,List)について
Listが完備なら停止する

(2)
sublist(Sub,List)について
Listが完備なら停止する

Prologの技芸 7.1節の練習問題

(1)
解の順序
issac,jacob,benjamin
規則の順序を入れ換えたときの解の順序
benjamin,jacob,issac

(2)
解の順序
jacob,terach,abraham,issac
規則の順序を入れ換えたときの解の順序
terach,abraham,issac,jacob

Prologの技芸 6.1節の練習問題

(1)
daughter(X,haran)?
father(haran,X) {X=lot}
male(lot)
true
father(haran,X) {X=milcah}
male(milcah)
fail
father(haran,X) {X=yiscah}
male(yiscah)
fail

(2)
sort([3,1,2],Xs)?
sort([1,2],Zs)
sort([2],Zs1)
sort([],Zs2) {Zs2=[]}
true
isnert(2,[],Zs1) {Zs1=[2]}
true
insert(1,[2],Zs) {Zs=[2,Ys]}
1>2
fail
insert(1,[2],Zs) {Zs=[1,2]}
1 =< 2
true
insert(3,[1,2],Xs) {Xs=[1,Ys]}
3 > 1
insert(3,[2],Ys) {Ys=[2,Ys1]}
3 > 2
insert(3,[],Ys1) {Ys1=[3]}
true

Prologの技芸 5.2節の練習問題

(1)
第1引数と第2引数,または第3引数が完備自然数であるゴール
からなる領域に対して停止する.

2010年9月7日火曜日

Prologの技芸 4.2節の練習問題

(1)
挿入ソート
sort([3,1,2],Ys)
sort([1,2],Zs1)
sort([2],Zs2)
sort([],Zs3) {Zs3=[]}
true
insert(2,[],Zs2) {Zs2=[2]}
true
insert(1,[2],Zs1) {Zs1=[2|Zs4]}
1>2
fail
insert(1,[2],Zs1) {Zs1=[1,2|[]]}
1=<2
true
insert(3,[1,2],Ys) {Ys=[1|Ys1]}
3>1
true
insert(3,[2],Ys1) {Ys1=[2|Ys2]}
3>2
true
insert(3,[],Ys2) {Ys2=[3]}
true


クイックソート
sort([3,1,2],Ys)
partition([1,2],3,Ls,Bs) {Ls=[1|Ls1]}
1 =< 3
true
partition([2],3,Ls1,Bs) {Ls1=[2|Ls2]}
2 =< 3
true
partition([],3,Ls2,Bs) {Ls2=[], Bs=[]}
true
sort([1,2],Ls3)
partition([2],1,Ls4,Bs1) {Ls4=[2|Ls5]}
2 =< 1
fail
partition([2],1,Ls4,Bs1) {Bs1=[2|Bs2]}
2 > 1
true
partition([],1,Ls4,Bs2) {Ls4=[], Bs2=[]}
true
sort([],Ls5) {Ls5=[]}
true
sort([2],Bs3)
partition([],2,Ls6,Bs4) {Ls6=[], Bs4=[]}
true
sort([],Ls7) {Ls7=[]}
true
sort([],Bs5) {Bs5=[]}
true
append([],[2],Bs3) {Bs3=[2]}
true
append([],[1,2],Ls3) {Ls3=[1,2]}
true
sort([],Bs6) {Bs6=[]}
true
append([1,2],[3],Ys) {Ys=[1,2,3]}
true


(2)
derivative(3*sin(x)-4*cos(x),x,D) {D=0}
constant(3*sin(x)-4*cos(x))
integer(3*sin(x)-4*cos(x))
fail
derivative(3*sin(x)-4*cos(x),x,D) {D=DF-DG}
derivative(3*sin(x),x,DF) {DF=0}
constant(3*sin(x))
integer(3*sin(x))
fail
derivative(3*sin(x),x,DF) {DF=3*DG1+DF1*sin(x)}
derivative(3,x,DF1) {DF1=0}
constant(3)
integer(3)
true
derivative(sin(x),x,DG1) {DG1=0}
constant(sin(x))
integer(sin(x))
fail
derivative(sin(x),x,DG1) {DG1=cos(x)}
true
derivative(4*cos(x),x,DG) {DG=0}
constant(4*cos(x))
integer(4*cos(x))
fail
derivative(4*cos(x),x,DG) {DG=4*DG1+DF1*cos(x)}
derivative(4,x,DF1) {DF1=0}
constant(4)
integer(4)
true
derivative(cos(x),x,DG1) {DG1=0}
constant(cos(x))
integer(cos(x))
fail
derivative(cos(x),x,DG1) {DG1=-sin(x)}
true

Prologの技芸 4.1節の練習問題

(1)
X=b
Xs=[]
Ys=[c,d]
L=[b|Zs]

(2)
N=s(0)
A=a
B=b
C=c
Ms=Xs