Prolog 无法使用“=”执行算术,但使用“is”会引发实例化错误

问题描述 投票:0回答:1

`我正在尝试解决序言中的逻辑难题,我一切正常,除了当我运行程序时,它不会将数字相加在一起,而是在中间用 + 打印它们,我尝试将 = 更改为我的函数,但在我名为第二个和第四个的函数上抛出和 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)]

prolog logic
1个回答
0
投票

您可以使用

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

拼图中是否还有一些代码中没有的信息?

© www.soinside.com 2019 - 2024. All rights reserved.