prolog - 为什么 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 有点生疏,但是如果您将 C == Lsum 更改为 C = Lsum (在您的第一个 addborders 谓词中),它就可以工作。
那是因为在您的谓词中,它评估 C == Lsum 并且这是不正确的。但是使用单个 '=' Prolog 会尝试匹配它,如果 C 等于 2205,这是可能的。
另请参阅https://stackoverflow.com/a/8220315/5609233以了解差异“=”和“==”。
推荐阅读
- sql - 如何将 SQL Server 列转换为行?
- symfony-2.8 - JWT Token 总是返回 Not Found Symfony2.8
- hadoop - 如何在 Hadoop Streaming 中处理 2 个具有不同输入格式的文件?
- kubernetes - 如何避免在 kubernetes http liveness 和 readiness 探针中编码?
- c - 时钟的性能计时
- python - Apache Tika 排除了一些 html 标签
- dart - 在颤动中占据整个高度,同时为其他小部件保持一些高度
- bash - PostgreSQL 交互式终端:用单引号或双引号传递参数 - 有什么区别吗?
- python - Python solve_ivp vs R lsoda
- css - 在两个内联块 div 中垂直居中文本