如何使用序言解决这个难题?

How to solve this puzzle using prolog?

我正在尝试解决这个序言难题,但现在卡住了。我尝试编写不同的规则和解决方案,但它没有打印解决方案。我是这种语言的新手,因此将不胜感激任何帮助。我在下面包括了我目前所拥有的。 这就是拼图... 一群朋友参加烹饪 class!根据以下事实,确定每个人的全名、他们最喜欢的调味料以及用该调味料制作的最喜欢的食谱。

  1. 喜欢辣椒粉的人做了美味的蔬菜千层面,但不是亚瑟。
  2. Stan,他的姓不是 Night,没有用留兰香做饭。
  3. 先生布拉德利喜欢用肉桂做饭。
  4. 杰克,他的姓氏不是庄园,喜欢用罗勒做饭,但他最喜欢的食谱不是烤剑鱼。
  5. Paul 制作了流浪汉土豆,但没有使用留兰香。亚瑟的姓不是夜。
  6. Frank Jones 没有做烤箭鱼。
  7. Stan,他的姓氏不是 Manor,做了一个很棒的慢烤猪里脊,但没有使用鼠尾草。
  8. 先生夏天,他的名字不是亚瑟,做了一只很棒的调味鸡,但没有使用鼠尾草。

这是我目前所拥有的...

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)]

(约束传播找到的单一解决方案,无搜索)。