このディレクトリの索引

animal(sparrow,    [1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1]).
animal(bear,       [1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0]).
animal(tiger,      [1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0]).
animal(ostrich,    [1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1]).
animal(salmon,     [0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1]).
animal(goldfish,   [0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0]).
animal(snake,      [0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0]).
animal(cow,        [1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1]).
animal(eagle,      [1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0]).
animal(duck,       [1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1]).
animal(goose,      [1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1]).

question(1,'Does the animal have legs?').
question(2,'Can the animal fly?').
question(3,'Does the animal have wings?').
question(4,'Does the animal live in the woods?').
question(5,'Does the animal live in the jungle?').
question(6,'Does the animal live in the sea?').
question(7,'Does the animal live in rivers?').
question(8,'Can the animal swim?').
question(9,'Does the animal eat grass?').
question(10,'Is the animal dangerous?').
question(11,'Can the animal be a pet?').
question(12,'Can the animal be ordered in a restaurant?').

動物当てゲーム :-
        解答候補の動物を得る(_候補動物),
        ヒントを表示しその真偽を示す(_候補動物,_ヒントの解ならび),
        全問が真となる動物を探し出す(_ヒントの解ならび,_動物ならび),
        全問が真となる動物を表示する(_動物ならび).

解答候補の動物を得る(_候補動物) :-
        全解収集(_動物,animal(_動物,_),_動物ならび),
        表示('Pick a number from 1 to 11 '),
        読む(_選択番号),
        表示('OK, I am thinking of an animal!\n'),
        _選択番号 = _動物のならび順,
        n番目のリストの要素は(_動物のならび順,_動物ならび,_候補動物).

ヒントを表示しその真偽を示す(_候補動物,_ヒントの解ならび) :-
        全解収集([_質問文番号,_0または1],(
                    for(1,N,3),
                    質問文番号を得る(N,_質問文番号),
                    候補動物だとするとそれは真か偽か(_候補動物,_質問文番号,_0または1),
                    真偽表示(_0または1)),
                _ヒントの解ならび).

全問が真となる動物を探し出す(_回答ならび,_動物ならび) :-
        全解収集(_動物,(
                    animal(_動物,L),
                    全問正解(_回答ならび,L)),
          _動物ならび).

全問が真となる動物を表示する(_動物ならび) :-
        解答を示す前の遅延(3),
        動物の表示(_動物ならび).

質問文番号を得る(N,_質問文番号) :-
        _残りの質問数 is 3 - N + 1,
        表示('You have %t questions to guess it.\nWhat do you pick: ',[_残りの質問数]),
        質問文番号と質問文の表示,
        読む(_質問文番号).

質問文番号と質問文の表示 :-
        question(_質問文番号,_質問文),
        表示('%t: %t\n',[_質問文番号,_質問文]),
        後戻り.
質問文番号と質問文の表示.

候補動物だとするとそれは真か偽か(_候補動物,_質問文番号,_0または1) :-
        animal(_候補動物,_真偽値ならび),
        _質問文番号 = _要素位置,
        n番目のリストの要素は(_要素位置,_真偽値ならび,_0または1).
        
真偽表示(_0または1) :-
        真偽表示句(_表示句,_0または1),
        表示('%t\n',[_表示句]).

真偽表示句('yes!',1),
真偽表示句('no...',0).

解答を示す前の遅延(0) :- !.
解答を示す前の遅延(N) :-
        表示('The answer will appear in %t seconds!\n',[N]),
        sleep(1),
        M is N - 1,
        解答を示す前の遅延(M).

全問正解([],_).
全問正解([[_質問文番号,_0または1]|R],_真偽値ならび),
        n番目のリストの要素は(_質問文番号,_真偽値ならび,_0または1),
        全問正解(R,L),

動物の表示([]).
動物の表示([_動物|R]),
        表示('The answer was %t!\n',[_動物]),
        動物の表示(R).

%%%%  <ユーザ定義> :- <組込み述語> %%%%%
全解収集(_解,_質問,_解ならび) :- findall(_解,_質問,_解ならび).
後戻り :- fail.
表示(S,L) :- write_formatted(S,L).
表示(S) :- write(S).
読む(X) :- read(X).
n番目のリストの要素は(A,B,C) :- list_nth(A,B,C).