用CLIPS模拟P-System.

本文介绍了一种使用CLIPS专家系统模拟P-System计算n的平方的方法。通过定义规则与模板,实现了从输入到计算过程再到最终结果的完整模拟。

这两天我用CLIPS模拟了一个简单的P-System实例。即计算n的平方的P-System。下面是模拟的一些思路及代码。

事实上,用CLIPS模拟文法类的规则是相对简单的,因为CLIPS本身就是专家系统,而专家系统就是一些规则跟知识库。但是,写过一些CLIPS程序后,我才发现这种简单也是相对的。因为对于一个写惯诸如C语言等命令式语言的人来说,CLIPS缺少了变量,循环等经典操作,如果这一思想没转变过来,写起程序来也是很困难的。

这个计算n平方的P-System可以表达如下:

[ [ [a->ad a->de f->ff    af ](3) [ ](4) ] d->b b->b(c,in(4)) (ff->af)>(f->ae)  ](2) ](1)  e代表溶解

在CLIPS下实现如下:

初始事实如下:

(reset)
(assert (parallel m3_1))
(assert (maxplay 5))
(assert (curmem m3))
(assert (numplayed 0))
(assert (m3-a (value 1)))
(assert (m3-b (value 0)))
(assert (m3-c (value 0)))
(assert (m3-d (value 0)))
(assert (m3-f (value 1)))
(assert (m4-c (value 0)))
(agenda)
(run)
(facts)

规则跟模板定义如下:

 

(deftemplate m3-a
 (slot value
 (type NUMBER)
 (default 0)))

(deftemplate m3-b
 (slot value
 (type NUMBER)
 (default 0)))

(deftemplate m3-c
 (slot value
 (type NUMBER)
 (default 0)))

(deftemplate m3-d
 (slot value
 (type NUMBER)
 (default 0)))

(deftemplate m3-f
 (slot value
 (type NUMBER)
 (default 0)))

(deftemplate m2-a
 (slot value
 (type NUMBER)
 (default 0)))

(deftemplate m2-b
 (slot value
 (type NUMBER)
 (default 0)))

(deftemplate m2-c
 (slot value
 (type NUMBER)
 (default 0)))

(deftemplate m2-d
 (slot value
 (type NUMBER)
 (default 0)))

(deftemplate m2-f
 (slot value
 (type NUMBER)
 (default 0)))

(deftemplate m1-a
 (slot value
 (type NUMBER)
 (default 0)))

(deftemplate m1-b
 (slot value
 (type NUMBER)
 (default 0)))

(deftemplate m1-c
 (slot value
 (type NUMBER)
 (default 0)))

(deftemplate m1-d
 (slot value
 (type NUMBER)
 (default 0)))

(deftemplate m1-f
 (slot value
 (type NUMBER)
 (default 0)))
 
(deftemplate m4-a
 (slot value
 (type NUMBER)
 (default 0)))

(deftemplate m4-b
 (slot value
 (type NUMBER)
 (default 0)))

(deftemplate m4-c
 (slot value
 (type NUMBER)
 (default 0)))

(deftemplate m4-d
 (slot value
 (type NUMBER)
 (default 0)))

(deftemplate m4-f
 (slot value
 (type NUMBER)
 (default 0)))

(defrule m3-1
 (m3-a (value ?n&:(>= ?n 1)))
 ?f0 <- (m3-d (value ?m))
 ?f1 <- (curmem m3)
 (maxplay ?t)
 ?f2 <- (numplayed ?h&:(<= ?h ?t))
 ?f3 <- (parallel m3_1)
=>
 (bind ?m (+ ?m ?n))
 (bind ?h (+ ?h 1))
 (retract ?f2)
 (assert (numplayed ?h))
 (retract ?f0)
 (assert (m3-d (value ?m)))
 (retract ?f3)
 (assert (parallel m3_2)))

(defrule m3-2
 ?f0 <- (m3-f (value ?n&:(>= ?n 1)))
 ?f1 <- (curmem m3)
 ?f2 <- (parallel m3_2)
=>
 (bind ?n (* ?n 2))
 (retract ?f0)
 (assert (m3-f (value ?n)))
 (retract ?f2)
 (assert (parallel m3_1)))

(defrule m3-3
 ?f0 <- (m3-a (value ?n&:(>= ?n 1)))
 ?f1 <- (curmem m3)
 (maxplay ?t)
 ?f2 <- (numplayed ?h&:(> ?h ?t))
 ?f3 <- (m3-b (value ?bb))
 ?f4 <- (m3-c (value ?cc))
 ?f5 <- (m3-d (value ?dd))
 ?f6 <- (m3-f (value ?ff))
=>
 (bind ?n (- ?n 1))
 (retract ?f0)
 (assert (m3-a (value ?n)))
 (retract ?f1)
 (assert (curmem m2))
 (retract ?f3)
 (assert (m3-b (value 0)))
 (retract ?f4)
 (assert (m3-c (value 0)))
 (retract ?f5)
 (assert (m3-d (value 0)))
 (retract ?f6)
 (assert (m3-f (value 0)))
 (assert (m2-a (value ?n)))
 (assert (m2-b (value ?bb)))
 (assert (m2-c (value ?cc)))
 (assert (m2-d (value ?dd)))
 (assert (m2-f (value ?ff)))
 (assert (parallel m2_1)))

(defrule m2-1
 ?f0 <- (m2-d (value ?n&:(>= ?n 1)))
 ?f1 <- (parallel m2_2)
 ?f2 <- (m2-b (value ?t))
=>
 (retract ?f0)
 (assert (m2-d (value 0)))
 (retract ?f1)
 (assert (parallel m2_1))
 (retract ?f2)
 (assert (m2-b (value (+ ?n ?t)))))

(defrule m2-2
 ?f0 <- (m2-b (value ?n&:(>= ?n 1)))
 ?f1 <- (parallel m2_3)
 ?f2 <- (m4-c (value ?m))
=>
 (retract ?f1)
 (assert (parallel m2_1))
 (retract ?f2)
 (assert (m4-c (value (+ ?m ?n)))))

(defrule m2-3
 ?f0 <- (m2-f (value ?n&:(>= ?n 2)))
 ?f1 <- (m2-a (value ?t))
 ?f2 <- (parallel m2_1)
=>
 (bind ?n (+ (div ?n 2) (mod ?n 2)))
 (retract ?f0)
 (assert (m2-f (value ?n)))
 (retract ?f1)
 (assert (m2-a (value (+ ?t ?n))))
 (retract ?f2)
 (assert (parallel m2_3))
 (assert (parallel m2_2)))

(defrule m2-4
 ?f0 <- (m2-f (value ?n&:(= ?n 1)))
 ?f1 <- (m2-a (value ?t))
 ?f2 <- (m2-b (value ?bb))
 ?f3 <- (m2-c (value ?cc))
 ?f4 <- (m2-d (value ?dd))
 ?f5 <- (m2-f (value ?ff))
=>
 (retract ?f0)
 (assert (m2-f (value 0)))
 (retract ?f1)
 (assert (m2-a (value 0)))
 (retract ?f2)
 (assert (m2-b (value 0)))
 (retract ?f3)
 (assert (m2-c (value 0)))
 (retract ?f4)
 (assert (m2-d (value 0)))
 (retract ?f5)
 (assert (m1-a (value (+ ?t 1))))
 (assert (m1-b (value ?bb)))
 (assert (m1-c (value ?cc)))
 (assert (m1-d (value ?dd)))
 (assert (m1-f (value ?ff))))

 具体的注释没有详细说明,相信也不难看懂。

### .safetensors 文件名的含义及相关解析 #### 1. 文件命名规则与模型特性 文件名通常由模型名称、版本号以及特定优化信息组成,这些信息帮助用户快速识别模型的功能和适用场景。例如: - **animelllustDiffusion-v061.safetensors** - `animelllustDiffusion` 表示这是一个专注于动画风格生成的扩散模型[^1]。 - `v061` 表示版本号为 0.6.1,用于区分不同迭代版本。 - **dreamDiffusionSD3-sd3Likeness.safetensors** - `dreamDiffusionSD3` 结合了 Dream Diffusion 和 Stable Diffusion 3(SD3),表明这是 SD3 的改进版,可能针对特定风格或性能进行了优化[^3]。 - `sd3Likeness` 可能指代 SD3 的相似性增强功能,或者是在 SD3 基础上对人像或其他对象生成进行了优化。 - **dreamshaperXL-lightningDPMSDE.safetensors** - `dreamshaperXL` 是一个流行的 Stable Diffusion 变体模型,`XL` 表示扩展版,支持更高分辨率或更复杂的生成任务[^4]。 - `lightningDPMSDE` 表示使用了 DPMSDE 采样器的快速版本,`lightning` 意味着经过加速优化。 #### 2. 特定字段解释 以下是一些常见字段及其含义: - **Model Name**:模型的核心名称,如 `kohakuXL` 或 `nekorayxl`,通常反映模型的主要用途或风格。 - **Version Number**:如 `alpha7`、`beta7` 或 `v06W3`,表示开发阶段或具体版本号。 - **Optimization Information**:如 `lightningDPMSDE` 或 `Bakedvae`,描述模型的优化方式或技术细节。 - **Style Focus**:如 `ponyRealism` 或 `YamersAnime`,明确指出模型专注于某种特定风格(如写实或动漫)。 #### 3. 技术背景与应用 - **safetensors 格式**:作为一种新型模型格式,safetensors 旨在解决传统模型格式的安全风险问题。它通过不同的数据保存方式实现与 PyTorch 模型的互操作性,内容数据完全一致[^1]。 - **图像生成流程**:在使用这些模型时,用户可以通过输入简单的图片描述(Prompt)生成图像。如果需要更高的生成质量,则需遵循一定的 Prompt 设计规则[^2]。 #### 4. 示例代码 以下是一个加载 `.safetensors` 文件并检查其元数据的 Python 脚本: ```python from safetensors import safe_open def inspect_safetensors(file_path): with safe_open(file_path, framework="pt", device="cpu") as f: metadata = f.metadata() print(f"Metadata: {metadata}") # 替换为实际文件路径 inspect_safetensors("animelllustDiffusion-v061.safetensors") ``` --- ###
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值