如何使用序言解决这个难题?
How to solve this puzzle using prolog?
我正在尝试解决这个序言难题,但现在卡住了。我尝试编写不同的规则和解决方案,但它没有打印解决方案。我是这种语言的新手,因此将不胜感激任何帮助。我在下面包括了我目前所拥有的。
这就是拼图...
一群朋友参加烹饪 class!根据以下事实,确定每个人的全名、他们最喜欢的调味料以及用该调味料制作的最喜欢的食谱。
- 喜欢辣椒粉的人做了美味的蔬菜千层面,但不是亚瑟。
- Stan,他的姓不是 Night,没有用留兰香做饭。
- 先生布拉德利喜欢用肉桂做饭。
- 杰克,他的姓氏不是庄园,喜欢用罗勒做饭,但他最喜欢的食谱不是烤剑鱼。
- Paul 制作了流浪汉土豆,但没有使用留兰香。亚瑟的姓不是夜。
- Frank Jones 没有做烤箭鱼。
- Stan,他的姓氏不是 Manor,做了一个很棒的慢烤猪里脊,但没有使用鼠尾草。
- 先生夏天,他的名字不是亚瑟,做了一只很棒的调味鸡,但没有使用鼠尾草。
这是我目前所拥有的...
name[authur]
name[frank]
name[jake]
name[paul]
name[stan]
lname[bradley].
lname[jones].
lname[manor].
lname[night].
lname[summer].
snack[swordfish]
snack[potato]
snack[roast pork]
snack[chicken]
snack[lasagna]
seasoning[basil].
seasoning[cinnamon].
seasoning[paprika].
seasoning[sage].
seasoning[spearmint].
这是拼图的图片,非常感谢您的帮助。谢谢。
几乎直接取自该页末尾的 Metalevel's Zebra Puzzle 部分,可以通过为每个事物赋予 1-5 的值然后使值相等或不同来使用约束来解决。
从线索提示来看,Jake 和 Swordfish 的价值不一样,Stan 和 Pork 的价值不一样,等等。最努力的是得到结果,而且可能有比我更好的方法有:
:- use_module(library(clpfd)).
solve(Pairs) :-
Table = [First, Last, Snack, Seasoning],
First = [Arthur, Frank, Jake, Paul, Stan],
Last = [Bradley, Jones, Manor, Night, Summer],
Snack = [Swordfish, Potato, Pork, Chicken, Lasagna],
Seasoning = [Basil, Cinnamon, Paprika, Sage, Spearmint],
First = [1, 2, 3, 4, 5],
maplist(all_distinct, Table),
append(Table, Vs),
Vs ins 1..5,
pairs_keys_values(PFirst, First, [arthur, frank, jake, paul, stan]),
pairs_keys_values(PLast, Last, [bradley, jones, manor, night, summer]),
pairs_keys_values(PNames, PFirst, PLast),
pairs_keys_values(PSnack, Snack, [swordfish, potato, pork, chicken, lasagna]),
pairs_keys_values(PNameSnack, PNames, PSnack),
pairs_keys_values(PSeasoning, Seasoning, [basil, cinnamon, paprika, sage, spearmint]),
pairs_keys_values(Pairs, PNameSnack, PSeasoning),
Paprika #= Lasagna,
Paprika #\= Arthur,
Stan #\= Night,
Stan #\= Spearmint,
Bradley #= Cinnamon,
Jake #\= Manor,
Jake #= Basil,
Jake #\= Swordfish,
Paul #= Potato,
Paul #\= Spearmint,
Arthur #\= Night,
Frank #= Jones,
Frank #\= Swordfish,
Stan #\= Manor,
Stan #= Pork,
Stan #\= Sage,
Summer #\= Arthur,
Summer #= Chicken,
Summer #\= Sage.
给出:
?- solve(Pairs).
Pairs = [
1-arthur-(5-bradley)-(1-swordfish)-(3-basil),
2-frank-(2-jones)-(4-potato)-(5-cinnamon),
3-jake-(1-manor)-(5-pork)-(2-paprika),
4-paul-(4-night)-(3-chicken)-(4-sage),
5-stan-(3-summer)-(2-lasagna)-(1-spearmint)]
(约束传播找到的单一解决方案,无搜索)。
我正在尝试解决这个序言难题,但现在卡住了。我尝试编写不同的规则和解决方案,但它没有打印解决方案。我是这种语言的新手,因此将不胜感激任何帮助。我在下面包括了我目前所拥有的。 这就是拼图... 一群朋友参加烹饪 class!根据以下事实,确定每个人的全名、他们最喜欢的调味料以及用该调味料制作的最喜欢的食谱。
- 喜欢辣椒粉的人做了美味的蔬菜千层面,但不是亚瑟。
- Stan,他的姓不是 Night,没有用留兰香做饭。
- 先生布拉德利喜欢用肉桂做饭。
- 杰克,他的姓氏不是庄园,喜欢用罗勒做饭,但他最喜欢的食谱不是烤剑鱼。
- Paul 制作了流浪汉土豆,但没有使用留兰香。亚瑟的姓不是夜。
- Frank Jones 没有做烤箭鱼。
- Stan,他的姓氏不是 Manor,做了一个很棒的慢烤猪里脊,但没有使用鼠尾草。
- 先生夏天,他的名字不是亚瑟,做了一只很棒的调味鸡,但没有使用鼠尾草。
这是我目前所拥有的...
name[authur]
name[frank]
name[jake]
name[paul]
name[stan]
lname[bradley].
lname[jones].
lname[manor].
lname[night].
lname[summer].
snack[swordfish]
snack[potato]
snack[roast pork]
snack[chicken]
snack[lasagna]
seasoning[basil].
seasoning[cinnamon].
seasoning[paprika].
seasoning[sage].
seasoning[spearmint].
这是拼图的图片,非常感谢您的帮助。谢谢。
几乎直接取自该页末尾的 Metalevel's Zebra Puzzle 部分,可以通过为每个事物赋予 1-5 的值然后使值相等或不同来使用约束来解决。
从线索提示来看,Jake 和 Swordfish 的价值不一样,Stan 和 Pork 的价值不一样,等等。最努力的是得到结果,而且可能有比我更好的方法有:
:- use_module(library(clpfd)).
solve(Pairs) :-
Table = [First, Last, Snack, Seasoning],
First = [Arthur, Frank, Jake, Paul, Stan],
Last = [Bradley, Jones, Manor, Night, Summer],
Snack = [Swordfish, Potato, Pork, Chicken, Lasagna],
Seasoning = [Basil, Cinnamon, Paprika, Sage, Spearmint],
First = [1, 2, 3, 4, 5],
maplist(all_distinct, Table),
append(Table, Vs),
Vs ins 1..5,
pairs_keys_values(PFirst, First, [arthur, frank, jake, paul, stan]),
pairs_keys_values(PLast, Last, [bradley, jones, manor, night, summer]),
pairs_keys_values(PNames, PFirst, PLast),
pairs_keys_values(PSnack, Snack, [swordfish, potato, pork, chicken, lasagna]),
pairs_keys_values(PNameSnack, PNames, PSnack),
pairs_keys_values(PSeasoning, Seasoning, [basil, cinnamon, paprika, sage, spearmint]),
pairs_keys_values(Pairs, PNameSnack, PSeasoning),
Paprika #= Lasagna,
Paprika #\= Arthur,
Stan #\= Night,
Stan #\= Spearmint,
Bradley #= Cinnamon,
Jake #\= Manor,
Jake #= Basil,
Jake #\= Swordfish,
Paul #= Potato,
Paul #\= Spearmint,
Arthur #\= Night,
Frank #= Jones,
Frank #\= Swordfish,
Stan #\= Manor,
Stan #= Pork,
Stan #\= Sage,
Summer #\= Arthur,
Summer #= Chicken,
Summer #\= Sage.
给出:
?- solve(Pairs).
Pairs = [
1-arthur-(5-bradley)-(1-swordfish)-(3-basil),
2-frank-(2-jones)-(4-potato)-(5-cinnamon),
3-jake-(1-manor)-(5-pork)-(2-paprika),
4-paul-(4-night)-(3-chicken)-(4-sage),
5-stan-(3-summer)-(2-lasagna)-(1-spearmint)]
(约束传播找到的单一解决方案,无搜索)。