为什么序言不给变量正确的值?

时间:2018-11-27 23:46:09

标签: prolog

我正在用序言编写一个基本程序,但是我无法使其正常工作。这是代码:

我的序言代码。

borders(sweden,finland,586).
borders(norway,sweden,1619).

allborders(X,Y,L) :- borders(X,Y,L).
allborders(X,Y,L) :- borders(Y,X,L).
addborders(C,Lsum,Set) :- length(Set,0), write(C), write(' - '), write(Lsum), C == Lsum.
addborders(C,Lsum,[H|T]) :- Lsum2 is Lsum + H, addborders(C,Lsum2,T).
helpsetofpredicate(Country,L) :- allborders(Country,_,L).
circumference(C,Country) :- setof(L,helpsetofpredicate(Country,L),Set), addborders(C,0,Set).

(糟糕:边框只是一个巨大文件的小样本,但足以描述问题)

因此,该程序应该做的是对一个国家的所有边界求和,并检查给定的周长(C)是否为一个国家周长的总和(Country)。如果我要输入

circumference(2205,sweden).

程序给出true,这是预期的。但是如果我输入

circumference(C,sweden).

程序给出错误。我在代码中进行了一些写操作,以查看C和Lsum具有哪些值,并且输出是_G962-2205。为什么prolog不为C分配正确的值,而不是给它一个随机值?

1 个答案:

答案 0 :(得分:1)

我的Prolog有点生疏,但如果将C == Lsum更改为C = Lsum(在您的第一个addborders谓词中),它将起作用。

那是因为在您的谓词中,它的计算结果为C == Lsum,而事实并非如此。但是只有一个'='Prolog会尝试匹配它,如果C等于2205,这是可能的。

另请参见https://stackoverflow.com/a/8220315/5609233,以了解差异'='和'=='。