Prolog工匠难题:未定义谓词
我试图解决SWI序言中工匠们的困惑。事情进展得不太顺利Prolog工匠难题:未定义谓词,prolog,puzzle,Prolog,Puzzle,我试图解决SWI序言中工匠们的困惑。事情进展得不太顺利 %1. There are 5 craftsmen. A 'fierar', a 'brutar', a 'croitor', a 'gradinar' and a 'padurar' with names Fieraru, Brutaru, Croitoru, Gradinaru, Paduraru. It is known: %a. None of the craftsmen has the name of his craft (ex:
%1. There are 5 craftsmen. A 'fierar', a 'brutar', a 'croitor', a 'gradinar' and a 'padurar' with names Fieraru, Brutaru, Croitoru, Gradinaru, Paduraru. It is known:
%a. None of the craftsmen has the name of his craft (ex: fierar \== Fieraru);
%b. Salaries are from bigger to lower (means, Fieraru has the bigest salay, Paduraru - smallest);
%c. Paduraru is not a gradinar;
%d. croitor has a bigger salary than gradinar and smaller than brutar;
%What is the name of 'padurar'?
%Prima regulă determină structura datelor: meserias(Nume,Meserie,Salariu)
regula(1,[meserias(fieraru,_,1),meserias(brutaru,_,2),meserias(croitoru,_,3),meserias(gradinaru,_,4),meserias(paduraru,_,5)]).
regula(2, Meseriasi):-
member(meserias(_, fierar, _), Meseriasi),
member(meserias(_, brutaru, _), Meseriasi),
member(meserias(_, croitor, _), Meseriasi),
member(meserias(_, gradinar, _), Meseriasi),
member(meserias(_, padurar, _), Meseriasi).
regula(3, Meseriasi):-
not(member(meserias(fieraru,fierar,_), Meseriasi)),
not(member(meserias(brutaru,brutar,_), Meseriasi)),
not(member(meserias(croitoru,croitor,_), Meseriasi)),
not(member(meserias(gradinaru,gradinar,_), Meseriasi)),
not(member(meserias(paduraru,padurar,_), Meseriasi)).
%Predicatul salariu_mai_mare(Meserias1,Meserias2,Lista_meseriasilor) are multe variante. El joacă rolul constituirii permutărilor posibile.
salariu_mai_mare(P1,P2,[P1,P2,_,_,_]).
salariu_mai_mare(P1,P3,[P1,_,P3,_,_]).
salariu_mai_mare(P1,P4,[P1,_,_,P4,_]).
salariu_mai_mare(P1,P5,[P1,_,_,_,P5]).
salariu_mai_mare(P2,P3,[_,P2,P3,_,_]).
salariu_mai_mare(P2,P4,[_,P2,_,P4,_]).
salariu_mai_mare(P2,P5,[_,P2,_,_,P5]).
salariu_mai_mare(P3,P4,[_,_,P3,P4,_]).
salariu_mai_mare(P3,P5,[_,_,P3,_,P5]).
salariu_mai_mare(P4,P5,[_,_,_,P4,P5]).
regula(4,Meseriasi) :-
salariu_mai_mare(meserias(fieraru,_,_),meserias(brutaru,_,_),Meseriasi),
salariu_mai_mare(meserias(brutaru,_,_),meserias(croitoru,_,_),Meseriasi),
salariu_mai_mare(meserias(croitoru,_,_),meserias(gradinaru,_,_),Meseriasi),
salariu_mai_mare(meserias(gradinaru,_,_),meserias(paduraru,_,_),Meseriasi).
regula(5,Meseriasi) :-
member(meserias(paduraru,X,_),Meseriasi), X \== gradinar.
regula(6,Meseriasi) :-
salariu_mai_mare(meserias(_,croitor,_),meserias(_,gradinar,_),Meseriasi),
salariu_mai_mare(meserias(_,brutar,_),meserias(_,croitor,_),Meseriasi).
question(Nume,Meseriasi):-
member(meserias(Nume,padurar,_),Meseriasi).
solution(Nume, Meseriasi):-
regula(1,Meseriasi),
regula(2,Meseriasi),
regula(3,Meseriasi),
regula(4,Meseriasi),
regula(5,Meseriasi),
regula(6,Meseriasi),
question(Nume,Meseriasi).
我得到了一个错误:
Warning: The predicates below are not defined. If these are defined
Warning: at runtime using assert/1, use :- dynamic Name/Arity.
Warning:
Warning: question/2, which is referenced by
Warning: file.pl:60:8: 1-st clause of solution/2
解决方案是:Gradinaru是一个padurar
Meseriasi:Fieraru->brutar,Brutaru->croitor,Croitoru->gradinar,Gradinaru->padurar,Paduraru->fierar.实现一些薪资比较需要首先根据规则b将所有成员的最后一个职位与一个数字绑定(为什么不使用描述中的相同名称?在Prolog中可以使用符号)
这里的最后一个逗号有一个拼写错误“salariu_mai_mare(meserias(,brutar,),meserias(,croitor,),Meseriasi)”,用dotThreak@capelical替换它。现在我没有任何错误。但当我问
解决方案(名称,Meseriasi)。
我得到的答案是错误的。如何使该程序正确运行?当然,您必须对工资进行一些比较。我看不到正确的方法though@CapelliC,在课堂上我们有一个这样的例子。用于比较的是salariu\u mai\u mare。在这个例子中,我们从朋友列表中比较了谁玩得更好。无论如何,我怎样才能做一个更好的比较呢?你在regula(b,Meseriasi)
上犯了一个错误。菲拉鲁(长着痣的人)的薪水最高,帕杜拉鲁(长着痣的人)的薪水最低。嗯,在《规则》(1,…)中,我使用了这样一个想法。但数字的顺序是相反的。那没有道理。再说一次,你是对的,我没有看到那些数字。然后颠倒规则(d)AC中的比较。程序的结果为假。是一个干净的代码版本。谢谢。一个打字错误,太痛苦了!
regula(b, Meseriasi):-
member(meserias('Fieraru', _, 5), Meseriasi),
member(meserias('Brutaru', _, 4), Meseriasi),
...
% croitor has a biger salary than gradinar and smaller than brutar;
regula(d, Meseriasi) :-
member(meserias(_,croitor,A),Meseriasi),
member(meserias(_,gradinar,B),Meseriasi),
member(meserias(_,brutar,C),Meseriasi),
A > B, A < C.
regula(2, Meseriasi):-
member(meserias(_, fierar, _), Meseriasi),
member(meserias(_, brutaru, _), Meseriasi), ** here must be brutar
member(meserias(_, croitor, _), Meseriasi),
...