1

高校時代から Prolog に触れていなかったので、情報を探してみましたが、役に立ちませんでした。以下は、私の問題を説明する必要がある例です。

%% everybody():- [dana, cody, bess, abby].
%% Everybody = [dana, cody, bess, abby].

likes(dana, cody).
hates(bess, dana).
hates(cody, abby).

hates(X, Y):- \+ likes(X, Y).

likes_somebody(_, []):- fail.
likes_somebody(X, [girl | others]):-
    likes(X, girl) ; likes_somebody(X, others).

likes_everybody(_, []):- true.
likes_everybody(X, [girl | others]):-
    likes(X, girl) , likes_everybody(X, others).

maplist(likes_somebody, [dana, cody, bess, abby], [dana, cody, bess, abby]).

everybody女の子のリストであることを宣言するにはどうすればよいですか? コメント行は私が試したものですが、奇妙なエラー メッセージが返されます。

これは、これまで多かれ少なかれ従ったチュートリアルです。違いがあれば、GPrologを使用しています。このような基本的な質問で申し訳ありません。GProlog のマニュアルは言語構文を扱っていませんが、確かに見ました。余談ですが、(実装のドキュメントではなく) 言語のドキュメントをどこで探すべきかについての情報をいただければ幸いです。

4

1 に答える 1

2

Prolog のすべての変数は、大文字で始まる必要があります。したがってEverybody、まず、 ではなくが必要ですeverybody

2 番目の問題、Prolog の変数は割り当て可能ではありません。したがって、おそらくあなたがやりたいことは、事実を作成し、代わりにそれを使用することです:

everybody([dana, cody, bess, abby]).

コードの最終行は実際にはファクト定義であり、上書きしようとしますmaplist/3。おそらくやりたいことは、その行より上のすべてをファイル (たとえば、 という名前likes.pl) に入れ、それを参照する ( [likes].) ことです。次に、次のようなクエリを実行できます。

?- everybody(Everybody), maplist(likes_somebody, Everybody, Everybody).

likes_somebody/22 番目の引数でリストを処理するため、これは機能しません。あなたが持っている述語は次のlikes_somebody/2ように書くことができます:

likes_somebody(_, []).

それでもあまり意味はありません。空のリストで何かを統合するだけです:

?- likes_somebody(chicken_tacos, []).
true.

誰かが女の子かどうかを判断するには、次のような述語が必要です。

girl(dana).
girl(cody).
girl(bess).
girl(abby).

次に、あなたがやろうとしていると私が思うことを行うことができます。これはこれに近いものです:

likes_somebody(X) :- girl(X).

次に、マップリストの構築は次のように機能します。

everybody(Everybody), maplist(likes_somebody, Everybody).

これは単に true を返します。everybody/1代わりに使用することで単純化して排除できますがfindall(Girl, girl(X), Everybody)、奇妙になっています。

を使用してリスト処理を実行しようとしていますが、 is は文字通り変数ではなく、文字通りは別のリストの末尾になる可能性のあるある種のリストではないlikes_everybody/2ため、壊れています。girlgirlothersothers

浄化しなければならない古い考えがまだ残っていると思います。もっと読んで、もっと書いて、あなたのコードはより意味のあるものになり始めます。

于 2013-09-30T21:20:54.997 に答える