You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Python外部变量传入ProbLog?DeepProbLog神经符号应用需求

在DeepProbLog中传入Python变量的可行方法

DeepProbLog作为ProbLog与深度学习框架的结合工具,直接支持多种将Python变量传入ProbLog程序的方式,以下是几种实用方案:

1. 动态生成ProbLog事实注入

对于普通数值、字符串等静态变量,可直接在Python中生成ProbLog格式的事实语句,拼接进基础ProbLog程序后加载运行。示例代码:

from deepproblog import DeepProbLog

# 基础ProbLog逻辑
base_program = """
    query(valid(X, Y)).
    valid(X, Y) :- num_x(X), num_y(Y), X >= 0, Y <= 1.0.
"""

# Python变量
x_val = 3
y_val = 0.7

# 生成包含变量值的ProbLog事实
dynamic_facts = f"""
    num_x({x_val}).
    num_y({y_val}).
"""

# 合并并运行
full_program = base_program + dynamic_facts
engine = DeepProbLog(full_program)
result = engine.query("valid(X, Y)")
print(result)

这种方式适合传递无需实时更新的离散/连续数值变量。

2. 通过神经谓词传递张量变量

如果变量是PyTorch张量(深度学习场景常用),可借助DeepProbLog的NeuralPredicate,在查询时通过substitutions参数直接传入张量元素。示例代码:

import torch
from deepproblog.model import Model
from deepproblog.neural_networks import TorchNetwork

# 定义简单PyTorch网络
class ScoreNet(torch.nn.Module):
    def __init__(self):
        super().__init__()
        self.fc = torch.nn.Linear(2, 1)
    
    def forward(self, x):
        return torch.sigmoid(self.fc(x))

# 初始化DeepProbLog模型
net = TorchNetwork("score_net", ScoreNet(), batching=True)
model = Model("""
    query(score_result(Res)).
    score_result(Res) :- neural(score_net, [A, B], Res).
""", [net])

# Python张量变量
input_tensor = torch.tensor([[1.2, 3.4]])

# 传入变量查询
result = model.query("score_result(Res)", substitutions={"A": input_tensor[0][0], "B": input_tensor[0][1]})
print(result)

该方案适用于需要深度学习处理的连续型变量。

3. 注册外部Python函数调用变量

对于需要动态获取的Python变量(比如实时更新的全局变量),可将变量封装为Python函数,在ProbLog中通过external关键字调用。示例代码:

from deepproblog import DeepProbLog

# Python全局变量与对应函数
current_threshold = 5
def get_threshold():
    return current_threshold

# ProbLog程序定义外部函数调用
problog_code = """
    external(get_threshold/0).
    query(check_threshold(V)).
    check_threshold(V) :- V = get_threshold().
"""

# 注册并运行
engine = DeepProbLog(problog_code)
engine.register_external_function("get_threshold", get_threshold)
result = engine.query("check_threshold(V)")
print(result)

这种方式适合变量值会动态变化的场景,ProbLog运行时会实时调用Python函数获取最新值。


内容的提问来源于stack exchange,提问作者Joaquin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 18:12:05