`我正在尝试解决序言中的逻辑难题,我一切正常,除了当我运行程序时,它不会将数字相加在一起,而是在中间用 + 打印它们,我尝试将 = 更改为我的函数,但在我名为第二个和第四个的函数上抛出和 instantiation_error 。
这是我当前的代码:
simpsons([carry(homer, _, _), carry(marge, _, _), carry(bart, _, _), carry(lisa, _, _)]).
first(A) :- A = bart.
second(BT, ST) :- BT = ST + 8.
third(D, C, A) :- D = C ; D = A.
fourth(MT, HT) :- MT = HT + 8.
fifth(B) :- B = homer.
answer(X) :- simpsons(X),
member(carry(_,_,toot), X),
member(carry(_, 10, _), X),
member(carry(A, _, burp), X),
member(carry(B, _, sneeze), X),
member(carry(bart, BT, _), X),
member(carry(C, ST, cry), X),
member(carry(D, 6, _), X),
member(carry(marge, MT, _), X),
member(carry(homer, HT, _), X),
first(A),
second(BT, ST),
third(D, C, A),
fourth(MT, HT),
fifth(B).
我得到输出:
X =[carry(homer,10,sneeze),carry(marge,10+8,toot),carry(bart,6+8,burp),carry(lisa,6,cry)]
我想要的输出是:
X = [carry(homer,10,sneeze),carry(marge,18,toot),carry(bart,14,burp),carry(lisa,6,cry)]
您可以使用
freeze/2
延迟计算,直到变量有值:
second(BT, ST) :- freeze(ST, (BT is ST + 8)).
fourth(MT, HT) :- freeze(HT, (MT is HT + 8)).
然后
ground/1
以确保它不会给出冻结未完成计算的答案。 (我不知道为什么会这样,我以前从未尝试过冻结):
second(BT, ST), ground(ST),
fourth(MT, HT), ground(HT),
否则,您可以在 SWI Prolog 中使用 CLP(FD),它可以进行此类计算(其他 Prolog 系统也有约束求解器;语法和命名可能有所不同):
:- use_module(library(clpfd)).
second(BT, ST) :- BT #= ST + 8.
fourth(MT, HT) :- MT #= HT + 8.
但它现在给出负数解:
?- answer(X).
X = [carry(homer,10,sneeze), carry(marge,18,toot), carry(bart,6,burp), carry(lisa,-2,cry)] ;
X = [carry(homer,10,sneeze), carry(marge,18,toot), carry(bart,14,burp), carry(lisa,6,cry)] ;
X = [carry(homer,2,sneeze), carry(marge,10,toot), carry(bart,6,burp), carry(lisa,-2,cry)] ;
X = [carry(homer,2,sneeze), carry(marge,10,toot), carry(bart,14,burp), carry(lisa,6,cry)] ;
X = [carry(homer,-2,sneeze), carry(marge,6,cry), carry(bart,14,burp), carry(lisa,10,toot)] ;
X = [carry(homer,-10,sneeze), carry(marge,-2,cry), carry(bart,6,burp), carry(lisa,10,toot)] ;
所以也许你也可以将
ST #> 0
和 HT #> 0
限制在那里。那么它仍然给出了多种解决方案:
?- answer(X).
X = [carry(homer,10,sneeze), carry(marge,18,toot), carry(bart,14,burp), carry(lisa,6,cry)] ;
X = [carry(homer,2,sneeze), carry(marge,10,toot), carry(bart,14,burp), carry(lisa,6,cry)]
拼图中是否还有一些代码中没有的信息?