首页 > 解决方案 > 子句不在源文件警告中

问题描述

所以基本上我有这个确认和规则,不知何故编译器说这些子句不在源文件中,我不明白为什么,就像我认为程序写得很好?

程序:

forne(f001,zé_dos_parafusos,fabricante,carregado).
forne(f002,branquinho,fabricante,lisboa).
forne(f003,lar_ideal,fabricante,lisboa).

tipo_prod(p001,parafuso).
tipo_prod(p002,broca).
tipo_prod(p003,lavatório).
tipo_prod(p004,sabonete).
tipo_prod(p005,detergente).

og_prod(f001,p001,30000).
og_prod(f001,p002,500).
og_prod(f002,p003,25).
og_prod(f002,p004,50000).
og_prod(f002,p005,50000).
og_prod(f003,p001,1000).
og_prod(f003,p002,50).
og_prod(f003,p003,5).
og_prod(f003,p005,500).

tipo_prod(X, _) :- og_prod(X, _, _).

og_prod(X, Y, _) :- tipo_prod(Y, _), forne(X, _, _, _).

警告:

Clauses of tipo_prod/2 are not together in the source-file
Clauses of og_prod/3 are not together in the source-file 
Earlier definition at ex1 cap7.pl:11
          Current predicate: tipo_prod/2
          Use :- discontiguous og_prod/3. to suppress this message

如果有人可以向我解释这个程序有什么问题,我将不胜感激。

标签: prologcompiler-warnings

解决方案


Prolog 不关心子句是事实还是规则——它们都只是子句(事实根本没有 ":- ..." 部分;但您也可以将它们视为具有:- true)。

您有与这些谓词的事实分开的 tipo_prod/2 和 og_prod/3 规则。因此,您会收到警告,因为这通常表示拼写错误。

顺便说一句,您的代码可能不会做您认为它正在做的事情。我的猜测是,您想为规则tipo_prod/2 和 og_prod/3 使用不同的名称,这与事实的名称不同。


推荐阅读