1

私は最近学習Prologを始め、問題に遭遇しました。

以下が にロードされましたProlog:

likes(john, apple).
likes(john, pear).
likes(john, grapes).
likes(bill, mango).
likes(bill, apple).

のすべての人がの果物のようになった場合all_like(What, List)に返される述語を書いています。TrueListWhat

例えば:

all_like(apple,[john, bill]).

返す必要があります:

true ;
false.

all_like(grapes,[john, bill]).

返す必要があります:

false.

次のコードがあります。

all_like(What,List) :- check_list(What,List).

check_list(What,[]) :- write('true').
check_list(What, [X|Rest]) :- likes(X,What), check_list(What,Rest).
check_list(What, [X|Rest]) :- \+ likes(X,What), write('false').

私の結果は次のとおりです。

最初のクエリ

true
true .

2 番目のクエリ

false
true .

なぜ私がこれらの結果を得ているのか誰にも分かりますか?

出力される 2 番目のブール値の意味は何ですか?

最後に、.重要なスペースの後に出現することはありますか?

ご協力ありがとうございました。

4

1 に答える 1

3

Prolog は、述語が成功するか (trueまたはyes)、失敗するか (falseまたは) を既に示しnoているため、(a) 成功時に明示的に「true」と書き、(b) 成功しようとすると、述語で多くの作業を行います。失敗ケースと書き込み失敗。失敗したケースをただ失敗させるのが最善であり、そうすれば Prolog は失敗を表示します。

余談ですが、check_list述語は不要であり、単に使用できますall_likes。したがって、これが本当に必要なすべてです。

all_likes(_, []).             % An empty list likes anything
all_likes(What, [X|Rest]) :-  % All of [X|Rest] likes What if... 
    likes(X, What),           % X likes What and...
    all_likes(What, Rest).    % All of Rest likes What

SWI Prolog では、次の結果が表示されます。

?- all_likes(apple,[john, bill]).
true ;
false.

?- all_likes(grapes,[john, bill]).
false.

GNU Prolog では、出力は次のようになります。

| ?- all_likes(apple,[john, bill]).

true ? ;

no
| ?- all_likes(grapes,[john, bill]).

no
| ?-
于 2016-03-19T13:09:48.500 に答える