【问题标题】:How to solve this logic puzzle in prolog?如何解决prolog中的这个逻辑难题?
【发布时间】:2023-03-27 20:32:01
【问题描述】:
  1. A,B,C,D,E,F 是一个列表。
  2. C 在 E 之前
  3. A 在 F 之后
  4. E 不在第五位
  5. E 和 A 之间有两个
  6. B为E后,B与E相邻

第四个是哪一个?

【问题讨论】:

  • 您可以使用 nth1 和列表索引上的常用算术转换所有约束
  • 感谢您的回答。你能帮我写代码吗? @CapelliC
  • 您需要为解决问题付出一些努力并提出更具体的问题。你试过什么?这个网站不是来请别人为你做功课的地方。
  • @lurker 终于自己解决了问题
  • @MinglangJing 太好了!

标签: prolog logic


【解决方案1】:

最后我自己解决了问题

before(A,B) :- A<B.
after(A,B) :- A>B.
notInFifth(A) :- A \= 5.
adjacent(A,B) :- abs(A - B) =:= 1.
separatedByTwo(A,B) :- abs(A - B) =:= 2.


solution(A,B,C,D,E,F) :-
    permutation([1,2,3,4,5,6], [A,B,C,D,E,F]),
    notInFifth(E),
    separatedByTwo(D,A),
    adjacent(B,E),
    before(C,E),
    before(F,A),
    before(E,B).

列表是:c e b d f a

【讨论】:

  • 一些改进建议... 使用 CLP(FD) 进行算术运算,例如 A #&lt; BA #&gt; Babs(A-B) #= 1 等。此外,您只需不需要 findall(X0,permutation([1,2,3,4,5,6],X0),L), member([A,B,C,D,E,F],L) permutation([1,2,3,4,5,6], [A,B,C,D,E,F]) 代替它。或者更好,而不是 permutation([1,2,3,4,5,6], [A,B,C,D,E,F]),使用 CLP(FD) 并使用 [A,B,C,D,E,F] ins 1..6, all_different([A,B,C,D,E,F])。要使用 CLP(FD),如果您使用的是 SWI Prolog,则需要 :- use_module(library(clpfd)).
  • 谢谢你的建议,我会努力的
  • 即使您选择不使用 CLP(FD),只需将 findall(X0,permutation([1,2,3,4,5,6],X0),L), member([A,B,C,D,E,F],L) 替换为 permutation([1,2,3,4,5,6], [A,B,C,D,E,F]) 即可。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 2021-06-12
  • 1970-01-01
相关资源
最近更新 更多