序言为不同的参数打印出相同的答案
prolog printing out same answer for different parameters
我正在编写一个解决逻辑难题的 Prolog 程序。当试图打印出答案时,它给了我所有答案相同的答案。逻辑谜题的答案是:
- genevieve 买了 4 码的 manzarita
- lucia 买了 7 号 Graffetz
- shawna 买了 5 号 williford
- vanessa 买了 6 号 Abbot Hill
我的代码如下:
customer(genevieve).
customer(lucia).
customer(shawna).
customer(vanessa).
shoesize(4).
shoesize(5).
shoesize(6).
shoesize(7).
manufactorer(abbothill).
manufactorer(manzarita).
manufactorer(graffetz).
manufactorer(williford).
solve :-
shoesize(GenevieveShoesize),
shoesize(LuciaShoesize),
shoesize(ShawnaShoesize),
shoesize(VanessaShoesize),
all_different([GenevieveShoesize, LuciaShoesize, ShawnaShoesize, VanessaShoesize]),
manufactorer(AbbotHillManufactorer),
manufactorer(ManzaritaManufactorer),
manufactorer(GraffetzManufactorer),
manufactorer(WillifordManufactorer),
all_different([AbbotHillManufactorer, ManzaritaManufactorer,
GraffetzManufactorer, WillifordManufactorer]),
List = [ [genevieve,GenevieveShoesize,AbbotHillManufactorer],
[lucia,LuciaShoesize,ManzaritaManufactorer],
[shawna,ShawnaShoesize,GraffetzManufactorer],
[vanessa,VanessaShoesize,WillifordManufactorer]],
\+(member([_,5,manzarita],List)),
\+(member([_,6,manzarita],List)),
\+(member([lucia,5,_],List)),
\+(member([lucia,6,_],List)),
\+(member([genevieve,_,abbothill],List)),
\+(member([shawna,_,graffetz],List)),
(member([vanessa,_,abbothill],List)),
tell(genevieve,GenevieveShoesize,GeneieveManufactorer),
tell(lucia,LuciaShoesize,LuciaManufactorer),
tell(shawna,ShawnaShoesize,ShawnaManufactorer),
tell(vanessa,VanessaShoesize,VanessaManufactorer).
all_different([H | T]) :- member(H,T), !, fail.
all_different([_ | T]) :- all_different(T).
all_different([]).
tell(X,Y,Z) :-
customer(X),
shoesize(Y),
manufactorer(Z),
write(X), write(' got their shoes from'),
write(Y), write(' and is a size '), write(Z), nl.
当我去 SWI 并要求它:
-告诉(X,Y,Z)
它输出:
X 等于 genevieve,
Y 等于 4,
Z 等于方丈山。
如果我指定其中一个变量,例如
告诉(凡妮莎,Y,Z)
它会打印出来:vanessa bought a size 4 abbot hill ;保持 Y 和 Z 的值相同。
The answers to the logic puzzle are: -genevieve bought a size 4 manzarita -lucia bought a size 7 Graffetz -shawna bought a size 5 williford -vanessa bought a size 6 Abbot Hill"
如果这些是谜题的唯一答案,那么您的逻辑是错误的,您的代码生成的答案比这多得多。
根据你的程序,下面是一些解决方案:
X = genevieve,
Y = 4,
Z = abbothill ;
genevieve got their shoes from4 and is a size manzarita
X = genevieve,
Y = 4,
Z = manzarita ;
genevieve got their shoes from4 and is a size graffetz
X = genevieve,
Y = 4,
Z = graffetz ;
genevieve got their shoes from4 and is a size williford
X = genevieve,
Y = 4,
Z = williford ;
genevieve got their shoes from5 and is a size abbothill
X = genevieve,
Y = 5,
Z = abbothill ;
genevieve got their shoes from5 and is a size manzarita
X = genevieve,
Y = 5,
Z = manzarita ;
genevieve got their shoes from5 and is a size graffetz
X = genevieve,
Y = 5,
Z = graffetz ;
genevieve got their shoes from5 and is a size williford
X = genevieve,
Y = 5,
Z = williford ;
如果你想找到所有唯一的解决方案,你可以运行:setof((X,Y,Z), tell(X,Y,Z), Y).
根据您的程序生成 64 个不同的有效解决方案。
if I specify one of the variables for example tell(vanessa,Y,Z) it will print out : vanessa bought a size 4 abbot hill ; leaving the values of Y and Z the same.
它不会让值 Y
和 Z
相同,它只是意味着 Y = 4, Z = abbothill
是 第一个 解决方案X = vanessa
,您可以使用 ;
生成下一个解决方案,您会看到 Y
和 Z
并不总是相同的,例如:
?- tell(vanessa,Y,Z).
vanessa got their shoes from4 and is a size abbothill
Y = 4,
Z = abbothill ;
vanessa got their shoes from4 and is a size manzarita
Y = 4,
Z = manzarita ;
vanessa got their shoes from4 and is a size graffetz
Y = 4,
Z = graffetz ;
vanessa got their shoes from4 and is a size williford
Y = 4,
Z = williford ;
vanessa got their shoes from5 and is a size abbothill
Y = 5,
Z = abbothill ;
编辑: 如果您要解决的是这个逻辑难题:
There are 4 customers: Genevieve, Lucia, Shawna, Vanessa
There are 4 shoe sizes: 4, 5, 6, 7
There are 4 shoe manufacturers: Abbott Hill, Manzarita, Graffetz,
Williford
Of the Manzarita footwear and Lucia's pair, one was a size 7 and the other was a size 4.
Genevieve's pair was 2 sizes smaller than the Abbott Hill footwear.
Vanessa's pair was 2 sizes larger than Genevieve's pair.
The Graffetz footwear was somewhat larger than Shawna's pair.
For each customer, show their name, their shoe size and their shoe's
manufacturer in a format similar to this:
Joe bought a size 13 Nike.
Tom bought a size 12 Reebok.
你可以使用这样的东西:
customer(genevieve).
customer(lucia).
customer(shawna).
customer(vanessa).
shoesize(4).
shoesize(5).
shoesize(6).
shoesize(7).
manufactorer(abbothill).
manufactorer(manzarita).
manufactorer(graffetz).
manufactorer(williford).
four_or_seven(L):-
member((lucia, 7, _), L),
member((_, 4, manzarita), L).
four_or_seven(L):-
member((lucia, 4, _), L),
member((_, 7, manzarita), L).
less_than_abbott_hill(L):-
member((genevieve, S0, _), L),
member((_, S1, abbothill), L),
S0 is S1-2.
vanessa_larger_than_genevieve(L):-
member((vanessa, S0, _), L),
member((genevieve, S1, _), L),
S0 is S1+2.
graffetz_larger_than_shawna(L):-
member((shawna, S0, _), L),
member((_, S1, graffetz), L),
S1 > S0.
solve:-
shoesize(S0), manufactorer(M0),
shoesize(S1), manufactorer(M1),
shoesize(S2), manufactorer(M2),
shoesize(S3), manufactorer(M3),
all_different([M0,M1,M2,M3]),
L = [(genevieve, S0, M0), (lucia, S1, M1), (shawna, S2, M2), (vanessa, S3, M3)],
four_or_seven(L),
less_than_abbott_hill(L),
vanessa_larger_than_genevieve(L),
graffetz_larger_than_shawna(L),
print(L).
all_different([H | T]) :- member(H,T), !, fail.
all_different([_ | T]) :- all_different(T).
all_different([]).
print([(C, S, M)|T]):-
format("~p bhought a size ~p ~p~n", [C,S,M]),
print(T).
print([]).
注意这个谜题有多种解法,例如运行:
?- [puzzle].
true.
?- solve.
genevieve bhought a size 4 manzarita
lucia bhought a size 7 graffetz
shawna bhought a size 4 williford
vanessa bhought a size 6 abbothill
true ;
genevieve bhought a size 4 manzarita
lucia bhought a size 7 graffetz
shawna bhought a size 5 williford
vanessa bhought a size 6 abbothill
true
我正在编写一个解决逻辑难题的 Prolog 程序。当试图打印出答案时,它给了我所有答案相同的答案。逻辑谜题的答案是:
- genevieve 买了 4 码的 manzarita
- lucia 买了 7 号 Graffetz
- shawna 买了 5 号 williford
- vanessa 买了 6 号 Abbot Hill
我的代码如下:
customer(genevieve).
customer(lucia).
customer(shawna).
customer(vanessa).
shoesize(4).
shoesize(5).
shoesize(6).
shoesize(7).
manufactorer(abbothill).
manufactorer(manzarita).
manufactorer(graffetz).
manufactorer(williford).
solve :-
shoesize(GenevieveShoesize),
shoesize(LuciaShoesize),
shoesize(ShawnaShoesize),
shoesize(VanessaShoesize),
all_different([GenevieveShoesize, LuciaShoesize, ShawnaShoesize, VanessaShoesize]),
manufactorer(AbbotHillManufactorer),
manufactorer(ManzaritaManufactorer),
manufactorer(GraffetzManufactorer),
manufactorer(WillifordManufactorer),
all_different([AbbotHillManufactorer, ManzaritaManufactorer,
GraffetzManufactorer, WillifordManufactorer]),
List = [ [genevieve,GenevieveShoesize,AbbotHillManufactorer],
[lucia,LuciaShoesize,ManzaritaManufactorer],
[shawna,ShawnaShoesize,GraffetzManufactorer],
[vanessa,VanessaShoesize,WillifordManufactorer]],
\+(member([_,5,manzarita],List)),
\+(member([_,6,manzarita],List)),
\+(member([lucia,5,_],List)),
\+(member([lucia,6,_],List)),
\+(member([genevieve,_,abbothill],List)),
\+(member([shawna,_,graffetz],List)),
(member([vanessa,_,abbothill],List)),
tell(genevieve,GenevieveShoesize,GeneieveManufactorer),
tell(lucia,LuciaShoesize,LuciaManufactorer),
tell(shawna,ShawnaShoesize,ShawnaManufactorer),
tell(vanessa,VanessaShoesize,VanessaManufactorer).
all_different([H | T]) :- member(H,T), !, fail.
all_different([_ | T]) :- all_different(T).
all_different([]).
tell(X,Y,Z) :-
customer(X),
shoesize(Y),
manufactorer(Z),
write(X), write(' got their shoes from'),
write(Y), write(' and is a size '), write(Z), nl.
当我去 SWI 并要求它:
-告诉(X,Y,Z) 它输出: X 等于 genevieve, Y 等于 4, Z 等于方丈山。
如果我指定其中一个变量,例如 告诉(凡妮莎,Y,Z) 它会打印出来:vanessa bought a size 4 abbot hill ;保持 Y 和 Z 的值相同。
The answers to the logic puzzle are: -genevieve bought a size 4 manzarita -lucia bought a size 7 Graffetz -shawna bought a size 5 williford -vanessa bought a size 6 Abbot Hill"
如果这些是谜题的唯一答案,那么您的逻辑是错误的,您的代码生成的答案比这多得多。
根据你的程序,下面是一些解决方案:
X = genevieve,
Y = 4,
Z = abbothill ;
genevieve got their shoes from4 and is a size manzarita
X = genevieve,
Y = 4,
Z = manzarita ;
genevieve got their shoes from4 and is a size graffetz
X = genevieve,
Y = 4,
Z = graffetz ;
genevieve got their shoes from4 and is a size williford
X = genevieve,
Y = 4,
Z = williford ;
genevieve got their shoes from5 and is a size abbothill
X = genevieve,
Y = 5,
Z = abbothill ;
genevieve got their shoes from5 and is a size manzarita
X = genevieve,
Y = 5,
Z = manzarita ;
genevieve got their shoes from5 and is a size graffetz
X = genevieve,
Y = 5,
Z = graffetz ;
genevieve got their shoes from5 and is a size williford
X = genevieve,
Y = 5,
Z = williford ;
如果你想找到所有唯一的解决方案,你可以运行:setof((X,Y,Z), tell(X,Y,Z), Y).
根据您的程序生成 64 个不同的有效解决方案。
if I specify one of the variables for example tell(vanessa,Y,Z) it will print out : vanessa bought a size 4 abbot hill ; leaving the values of Y and Z the same.
它不会让值 Y
和 Z
相同,它只是意味着 Y = 4, Z = abbothill
是 第一个 解决方案X = vanessa
,您可以使用 ;
生成下一个解决方案,您会看到 Y
和 Z
并不总是相同的,例如:
?- tell(vanessa,Y,Z).
vanessa got their shoes from4 and is a size abbothill
Y = 4,
Z = abbothill ;
vanessa got their shoes from4 and is a size manzarita
Y = 4,
Z = manzarita ;
vanessa got their shoes from4 and is a size graffetz
Y = 4,
Z = graffetz ;
vanessa got their shoes from4 and is a size williford
Y = 4,
Z = williford ;
vanessa got their shoes from5 and is a size abbothill
Y = 5,
Z = abbothill ;
编辑: 如果您要解决的是这个逻辑难题:
There are 4 customers: Genevieve, Lucia, Shawna, Vanessa
There are 4 shoe sizes: 4, 5, 6, 7
There are 4 shoe manufacturers: Abbott Hill, Manzarita, Graffetz, Williford
Of the Manzarita footwear and Lucia's pair, one was a size 7 and the other was a size 4.
Genevieve's pair was 2 sizes smaller than the Abbott Hill footwear.
Vanessa's pair was 2 sizes larger than Genevieve's pair.
The Graffetz footwear was somewhat larger than Shawna's pair.
For each customer, show their name, their shoe size and their shoe's manufacturer in a format similar to this:
Joe bought a size 13 Nike.
Tom bought a size 12 Reebok.
你可以使用这样的东西:
customer(genevieve).
customer(lucia).
customer(shawna).
customer(vanessa).
shoesize(4).
shoesize(5).
shoesize(6).
shoesize(7).
manufactorer(abbothill).
manufactorer(manzarita).
manufactorer(graffetz).
manufactorer(williford).
four_or_seven(L):-
member((lucia, 7, _), L),
member((_, 4, manzarita), L).
four_or_seven(L):-
member((lucia, 4, _), L),
member((_, 7, manzarita), L).
less_than_abbott_hill(L):-
member((genevieve, S0, _), L),
member((_, S1, abbothill), L),
S0 is S1-2.
vanessa_larger_than_genevieve(L):-
member((vanessa, S0, _), L),
member((genevieve, S1, _), L),
S0 is S1+2.
graffetz_larger_than_shawna(L):-
member((shawna, S0, _), L),
member((_, S1, graffetz), L),
S1 > S0.
solve:-
shoesize(S0), manufactorer(M0),
shoesize(S1), manufactorer(M1),
shoesize(S2), manufactorer(M2),
shoesize(S3), manufactorer(M3),
all_different([M0,M1,M2,M3]),
L = [(genevieve, S0, M0), (lucia, S1, M1), (shawna, S2, M2), (vanessa, S3, M3)],
four_or_seven(L),
less_than_abbott_hill(L),
vanessa_larger_than_genevieve(L),
graffetz_larger_than_shawna(L),
print(L).
all_different([H | T]) :- member(H,T), !, fail.
all_different([_ | T]) :- all_different(T).
all_different([]).
print([(C, S, M)|T]):-
format("~p bhought a size ~p ~p~n", [C,S,M]),
print(T).
print([]).
注意这个谜题有多种解法,例如运行:
?- [puzzle].
true.
?- solve.
genevieve bhought a size 4 manzarita
lucia bhought a size 7 graffetz
shawna bhought a size 4 williford
vanessa bhought a size 6 abbothill
true ;
genevieve bhought a size 4 manzarita
lucia bhought a size 7 graffetz
shawna bhought a size 5 williford
vanessa bhought a size 6 abbothill
true