首页 > 解决方案 > 为什么 prolog 不为变量提供正确的值?

问题描述

我正在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).

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

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

circumference(2205,sweden).

该程序给出了真实的,这是预期的。但是如果我输入

circumference(C,sweden).

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

标签: prolog

解决方案


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

那是因为在您的谓词中,它评估 C == Lsum 并且这是不正确的。但是使用单个 '=' Prolog 会尝试匹配它,如果 C 等于 2205,这是可能的。

另请参阅https://stackoverflow.com/a/8220315/5609233以了解差异“=”和“==”。


推荐阅读