[英]Difficulty in Prolog
我需要使用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 * 某物 ”在哪里?我想显示属性的名称 (在这种情况下,仅是学生人数)。
编辑 :
添加整个代码:
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),
!.
您的代码中有错字。 您在冒号的地方放了一个逗号:
线
member(Tema, [transito, culinaria, reciclagem]);
应该读
member(Tema, [transito, culinaria, reciclagem]),
使用时,您可以放松对陈述的约束;
而不是,
。 使用时;
您是在说,以前发生的事情或现在发生的事情都是可以接受的。
因为当您开始说“现在将要发生什么”时,您仅定义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
中的solucao
变量。 注意X, W, R
已被删除。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.