- Exercise 10.4.
うーん。むずかしい。cutは宣言的かつ手続き的なの
で、慣れれば強力かもしれないが、慣れないと中途
半端で考えにくい。特にunificationがどう効いてく
るかが問題になると、自分で束縛管理した方が楽じゃ
んと思えてしまう。
ここは後日、再チャレンジ。
一晩寝たら5分でできた。。。
directTrain(saarbruecken,dudweiler).
directTrain(dudweiler,saarbruecken).
directTrain(forbach,saarbruecken).
directTrain(saarbruecken,forbach).
directTrain(freyming,forbach).
directTrain(forbach,freyming).
directTrain(stAvold,freyming).
directTrain(freyming,stAvold).
directTrain(fahlquemont,stAvold).
directTrain(stAvold,fahlquemont).
directTrain(metz,fahlquemont).
directTrain(fahlquemont,metz).
directTrain(nancy,metz).
directTrain(metz,nancy).
route(From,To,Route) :- rt(From,To,[To],Route).
rt(From,From,A,A) :- !.
rt(From,To,A,Route) :-
directTrain(From,To),
rt(From,From,[From|A],Route).
rt(From,To,A,Route) :-
directTrain(ViaSt,To),
rt(From,ViaSt,[ViaSt|A],Route).
** 5 Practical Session
- 1.
\+ version.
nu(A,B) :- \+ A = B.
\+ cut-free version
nu(A,B) :-
A = B, fail;
A \= B.
cut-fail combination version
nu(A,B) :- A = B, !, fail.
nu(_,_).
- 2.
頭がまわらないので、これも後日。
これも一晩寝たら30分くらいでできた。
unifiableUni(Term1,Term2) :-
atomic(Term1),atomic(Term2),
Term1 = Term2.
unifiableUni(Term1,Term2) :-
var(Term1);
var(Term2).
unifiableUni(Term1,Term2) :-
complexterm(Term1),
complexterm(Term2),
Term1 =.. [F1|Args1],
Term2 =.. [F2|Args2],
F1 = F2,
unifiableLists(Args1,Args2).
unifiableLists([],[]).
unifiableLists([H1|T1],[H2|T2]) :-
unifiableUni(H1,H2),
unifiableLists(T1,T2).
unifiableAcc([],Term,A,A).
unifiableAcc([H|T],Term,A,R) :-
unifiableUni(H,Term),
unifiableAcc(T,Term,[H|A],R),!;
unifiableAcc(T,Term,A,R).
unifiable(List1,Term,List2) :-
unifiableAcc(List1,Term,[],List2).
こつこつ。
0 件のコメント:
コメントを投稿