1

Prolog を使用して論理問題を解決する必要があります。問題が 1 つだけあります。

回答では、属性の名前は表示されません。属性を生成する私のコードは次のとおりです。

gera(p(Prof, AlunosProf, Tema, AlunosTema)) :-
       member(Prof, [palmira, roberta, selma]),
       member(AlunosProf, [40, 45, 50]),
       member(Tema, [transito, culinaria, reciclagem]);
       member(AlunosTema, [40, 45, 50]).

しかし、クエリを実行すると、次のようになります。

S = [p(palmira, _G2046, transito, 45),
    p(roberta, 50, reciclagem, _G2053),
    p(selma, _G2056, culinaria, _G2058)]

「_G* something 」はどこにあるのか 属性の名前を表示したい(この場合は学生の数のみ)。

編集

コード全体を追加します。

gera(p(Prof, AlunosProf, Tema, AlunosTema)) :-
       member(Prof, [palmira, roberta, selma]),
       member(AlunosProf, [40, 45, 50]),
       member(Tema, [transito, culinaria, reciclagem]),
       member(AlunosTema, [40, 45, 50]).


dif(p(P1, Q1, T1, Q12), p(P2, Q2, T2, Q22)) :-
    P1 \= P2, Q1 \= Q2, Q12 \= Q22, T1 \= T2.

tudoDif(P1, P2, P3) :-
    dif(P1, P2), dif(P1, P3), dif(P2, P3).

gera_ef(P1, P2, P3) :-
    P1 = p(palmira, _, _, _),
    P2 = p(roberta, _, _, _),
    P3 = p(selma, _, _, _).
    gera(P1), gera(P2), gera(P3),
    tudoDif(P1,P2,P3).

solucao(S) :-
        S = [P1, P2, P3],
    gera_ef(P1, P2, P3),
    member(p(palmira, X, transito, 45), S),
        member(p(selma, Z, culinaria, W), S),
        member(p(roberta, 50, reciclagem, R), S), 
    !.
4

2 に答える 2

1

;の代わりに使用すると、ステートメントの制約が緩和されます,。あなたが使用するとき、;あなたはそれを述べているのです

「これからどうなるか」と言い始めると、 の値のみを定義するためAlunosTema、他の値は、「_G233...」で表される任意の値を受け取ります。

次のことを試してください。

gera(p(Prof, AlunosProf, Tema, AlunosTema)) :-
       member(Prof, [palmira, roberta, selma]),
       member(AlunosProf, [40, 45, 50]),
       member(Tema, [transito, culinaria, reciclagem]),
       member(AlunosTema, [40, 45, 50]).

編集

投稿したコード全体を考慮して、いくつかのことを変更できます。

...

gera_ef(P1, P2, P3) :-
    P1 = p(palmira, _, _, _),
    P2 = p(roberta, _, _, _),
    P3 = p(selma, _, _, _),
    gera(P1),
    gera(P2),
    gera(P3),
    tudoDif(P1,P2,P3).

solucao(S) :-
    S = [P1, P2, P3],
    gera_ef(P1, P2, P3),
    member(p(palmira, _, transito, 45), S),
    member(p(selma, _, culinaria, _), S),
    member(p(roberta, 50, reciclagem, _), S),
    !.

ここでの問題は、 inの.代わりに aがあったことです。,

gera_ef(P1, P2, P3) :-
    ...,
    P3 = p(selma, _, _, _).
    ...

これにより、残りのコードを実行できなくなります。

solucaoもう 1 つの変更は、制限のない変数を_;に置き換えたことです。メモX, W, Rは削除されました。

于 2012-12-28T14:00:47.330 に答える
0

コードにタイプミスがあります。コンマを意味する場所にコロンを置きます。

この線

member(Tema, [transito, culinaria, reciclagem]);

読むべき

member(Tema, [transito, culinaria, reciclagem]),
于 2012-12-28T14:00:32.523 に答える