このディレクトリの索引
このディレクトリの索引

http://pc12.2ch.net/test/read.cgi/tech/1250204272/89
#  [1] 授業単元:プログラミング演習  
#  [2] 問題文:構造体triangeleはメンバとして、
#  各頂点の座標を表す構造体pointのp1,p2,p3を持つ。 
#  また関数show_triangleはtriangleの内容を表示する。 
#  乱数を利用してtriangleのインスタンスを1つ作成し、
#  関数show_trianglwを利用して、その内容を表示せよ。 

:- op(700,xfx,(::)).

インスタンス(0).
座標範囲(p1,0,2048).
座標範囲(p2,0,2048).
座標範囲(p3,0,2048).

new_triangle(_インスタンス) :-
    新しいインスタンス(_インスタンス),
    新しい頂点を得る([],L1,p1,V1),
    assertz(_インスタンス :: triangle(point(p1,V1))),
    新しい頂点を得る(L1,L2,p2,V2),
    assertz(_インスタンス :: triangle(point(p1,V2))),
    新しい頂点を得る(L2,_,p3,V3),
    assertz(_インスタンス :: triangle(point(p1,V3))),!.
    
show_triangle(_インスタンス) :-
    _インスタンス :: triangle(point(p1,V1))),
    _インスタンス :: triangle(point(p2,V2))),
    _インスタンス :: triangle(point(p3,V3))),
    write_formatted('p1 = %t\np2 = %t\np3 = %t\n',[V1,V2,V3]).
    
新しい頂点を得る(L1,[V|L1],P,V) :-
    座標範囲(P,S,E),
    X is E-S,
    V is (random mod X) + S,
    \+(member(V,L1)),!.
新しい頂点を得る(L1,L2,P,V) :-
    新しい頂点を得る(L1,L2,P,V).

新しいインスタンス(_インスタンス) :-
    retract(インスタンス(No)),
    No2 is No + 1,
    assertz(インスタンス(No2)),
    concat_atom(['$',No2],_インスタンス).