【发布时间】:2020-06-08 18:48:26
【问题描述】:
卡在 Prolog 问题上。我知道答案(因为我先在纸上做),但我不知道如何让 Prolog 得出答案。
问题:
比尔每天晚上都吃点心,吃不同的水果和不同的 每晚都吃坚果。从下面的陈述中,确定比尔的用途 上周每个工作日晚上的小吃。
a) 苹果比芒果吃得晚。
b) 一周吃香蕉的时间比吃杏仁和 花生,但比梨早。
c) 腰果比香蕉和香蕉更早被吃掉。 杏,但比花生晚。
d) 杏仁后的晚上没有吃山核桃。
e) 比尔吃了一晚核桃。
请注意,问题是大约 5 个工作日晚上(周一至周五), 并提到了 5 种水果和 5 种坚果。你的程序应该 解决问题并打印出解决方案,这将是一组 5 三元组,例如(星期一,苹果,山核桃),...(星期五,芒果,核桃)。
显然,这些不是正确的答案,而只是要显示的值 解决方案是什么样的。
到目前为止的代码:
before_in_week(X, Y, Days) :-
nth1(Xi, Days, X),
nth1(Yi, Days, Y),
Xi < Yi.
print_solve([Head|Tail]) :-
write(Head),
nl,
print_solve(Tail).
solve(A) :-
% all triples
A = [[day1, fruit1, nut1],
[day2, fruit2, nut2],
[day3, fruit3, nut3],
[day4, fruit4, nut4],
[day5, fruit5, nut5]],
Days = [monday, tuesday, wednesday, thursday, friday],
Days = [day1, day2, day3, day4, day5],
Fruits = [apple,banana,pear,mango,apricot],
permutation(Fruits, [fruit1, fruit2, fruit3, fruit4, fruit5]),
Nuts = [almonds,pecans,cashews,peanuts,walnuts],
permutation(Nuts, [nut1, nut2, nut3, nut4, nut5]),
% clue 1 - mango before apple
fruit5 \= mango,
member([C1,mango,_], A),
member([C2,apple,_], A), before_in_week(C1,C2,Days),
% clue 2 - banana after almonds and peanuts, but before pear
fruit5 \= banana,
member([C1,banana,_], A),
member([C2,pear,_], A), before_in_week(C1,C2,Days),
member([C3,_,almonds], A), before_in_week(C3,C1,Days),
member([C4,_,peanuts], A), before_in_week(C4,C1,Days),
% clue 3 - cashews before banana and apricot, but after peanuts
nut5 \= peanuts,
member([C1,_,cashews], A),
member([C2,_,peanuts], A), before_in_week(C1,C2,Days),
member([C3,banana,_], A), before_in_week(C3,C1,Days),
member([C4,apricot,_], A), before_in_week(C4,C1,Days),
% clue 4 - pecans not night after almonds
nut5 \= almonds,
% clue 5 - ate walnuts one night
print_solve(A).
【问题讨论】:
-
我添加了一个标签。仔细阅读它,看看它的答案是否有帮助。还有,问题是什么?代码是否有效,如图所示?您正在尝试的查询是什么?
-
@false(抢先)。在我添加突出显示之前,无论多么有缺陷,我什至没有看到小的 cased logvar。 YMWV。
-
fruit5 \= mango总是正确的。两个原子是不同的。 Prolog 的变量必须以大写字母开头,例如Fruit5。为了使 "ununifiable" 目标 (Fruit5 \= mango) 成功,logvar (Fruit5) 应该在尝试目标时已经实例化(出现在整体谓词中),否则该目标将失败,因为通过实例化一个免费的 logvar 总是可以与给定的值统一。 -
感兴趣的:Rosetta Code - Zebra Puzzle - Prolog versions
-
I did it on paper first你可能不知道作为一个有能力解决问题的人,这让你领先多少。
标签: prolog zebra-puzzle program-slicing