1

我需要使用 Prolog 解决逻辑问题。我只有一个问题:

在答案中,属性的名称没有出现。我生成属性的代码是:

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),
    !.

这里的问题是你有一个.而不是一个,

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

这将不允许其余代码执行。

另一个变化是solucao_;替换了无界变量。注意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 回答