假设我们有以下程序:
human(socrates).
day(tomorrow).
die(X) :- human(X).
may_go_to_school(Y) :- day(Y),
not holiday(Y).
Run Code Online (Sandbox Code Playgroud)
如果我们运行clingo来获取程序的答案集,我们就会得到
Answer: 1
human(socrates) day(tomorrow) die(socrates) may_go_to_school(tomorrow)
Run Code Online (Sandbox Code Playgroud)
我们知道地滚球将首先将所有变量实例化为常数,因此接地后的程序将是:
human(socrates).
day(tomorrow).
die(socrates) :- human(socrates).
may_go_to_school(tomorrow) :- day(tomorrow),
not holiday(tomorrow).
Run Code Online (Sandbox Code Playgroud)
我在Gelfond的书中读到它给出了3个获得答案集的规则:
满足Π的规则.换句话说,如果你相信它的身体,相信一个规则的头.
不要相信矛盾.
坚持"理性原则",其中说:"相信没有你不会被迫相信."
在规则中:
may_go_to_school(tomorrow) :- day(tomorrow),
not holiday(tomorrow).
Run Code Online (Sandbox Code Playgroud)
我们因为失败而得到了否定 not holiday(tomorrow)
如本书所示:
符号
not是一种新的逻辑连接,称为默认否定,(或否定为失败); 不是l经常被解读为"不相信我是真的."请注意,这并不意味着l被认为是假的.理所当然,理性推理者既不相信也不相信p否定,这是可以想象的¬p.
然后根据规则1,我应该相信believe in the head of a rule if you believe in its body身体,not holiday(tomorrow).因为我既不相信holiday(tomorrow).也不相信¬holiday(tomorrow).?
根据答案,我应该相信 ¬holiday(tomorrow).
我得到了以下答案集编程问题,但不确定我的答案是否正确:
以下是我的Clingo代码:
g(t1).
g(t2).
-e(t2).
u(t3).
e(X) :- a(X), not -e(X).
-e(X) :- u(X), not e(X).
e(X) :- g(X), not -e(X).
u(X) :- g(X).
a(X) :- u(X), not -a(X).
Run Code Online (Sandbox Code Playgroud)
clingo 0 pm.lp是:
Reading from pm.lp
pm.lp:9:15-24: info: atom does not occur in any rule head:
not (-a(X))
Solving...
Answer: 1
g(t1) g(t2) u(t3) -e(t2) u(t1) u(t2) a(t3) a(t1) a(t2) e(t3) e(t1)
Answer: 2
g(t1) g(t2) u(t3) -e(t2) u(t1) u(t2) a(t3) a(t1) a(t2) …Run Code Online (Sandbox Code Playgroud) 有没有简单的方法可以将Prolog / ASP代码转换为CLIPS?
像这样的东西,但是使用CLIPS而不是Prover9:https : //github.com/potassco/anthem/tree/master/examples
测试数据
addEmployee(EmplID, Name1, Name2, TypeOfWork, Salary, TxnDate)
addEmployee("tjb1998", "eva", "mcdowell", "ra", 55000, 20).
addEmployee("tjb1987x", "ben", "xena", "cdt", 68000, q50).
addEmployee("tjb2112", "ryoko", "hakubi", "ra", 63000, 60).
addEmployee("tjb1987", "ben", "croshaw", "cdt", 68000, 90).
addEmployee("tjb3300m", "amane", "mauna", "ma", 61000, 105).
Run Code Online (Sandbox Code Playgroud)
我想根据工作类型和特定工作类型的员工数量对员工进行分组。例如:
ra 4
cdt 2
ma 1
Run Code Online (Sandbox Code Playgroud)
下面是我正在尝试运行的查询
employee(TOW) :- addEmployee(_,_,_,TOW,_,_).
nmbrEmployeesOfSameType (N) :- N = #count { employee(TOW) }.
Run Code Online (Sandbox Code Playgroud)
请指教,我是 Clingo 的初级水平
我不确定如何在 clingo4(ASP 求解器)中编写优化语句。
我想最小化每个答案集中某些文字的实例总数。
我正在 ASP 中模拟火灾响应代理。代理可以选择在不同时间执行某些简单的操作,例如:
0{call_fire_department(Area, Time, Time+1)}1:- [preconditions].
0{send_security_guard(Guard, Area, Time, Time+1)}1:- [preconditions].
0{activate_fire_suppression(Area, Time, Time+1)}1:- [preconditions].
Run Code Online (Sandbox Code Playgroud)
代理有目标,需要在特定时间混合执行上述操作。我希望最大限度地减少上述每种情况的实例数量,同时仍然实现代理目标。
如何编写适当的优化语句?(我假设我需要一个“最小化”声明)。
谢谢。
我有以下数据集:
food_a(bagel, 245).
food_a(sandwich, 200).
food_a(salad,300).
food(bagel).
food(sandwich).
food(salad).
Run Code Online (Sandbox Code Playgroud)
我想满足以下约束:给定总卡路里数,我想返回满足该限制的食品。例如。总卡路里计数 = 500,程序应返回“百吉饼+三明治”作为解决方案。我按照 clingo 代码对他进行了编码:
food_a(bagel, 245).
food_a(sandwich, 200).
food_a(salad,300).
food(bagel).
food(sandwich).
food(salad).
has(bagel, wheat).
has(sandwich, bread).
has(sandwich, tomatoes).
has(sandwich, onion).
has(sandwich, cheese).
%calories(food,amount):-food_a(food,amount).
%food(F):-food_a(F,C).
%limits(calories,200).
%sol(F) :- food_a(F,C1),food_a(F,C2), C1+C2<500.
%:- {food(F,C) : food_a(F,C1),food_a(F,C2)} , C1+C2 >500.
%food_diet(F) :- food(F,C), C<250.
%:- food(F1) ,food_a(F2,C2), C1+C2=445.
totals(P, S) :- S = #sum{ I : food_a(P,I)}, food(P), S<500.
Run Code Online (Sandbox Code Playgroud)
显然,该程序只返回单一食物,而不是一次考虑 2 或 3 个食物的组合。任何人都可以建议我必须遵循的更改或步骤才能实现相同的目标。
我对Clingo(和逻辑编程)完全陌生,我正在寻找实现以下基本约束的最佳方法:
Q1.我有一个谓词selected(T),其中T的范围从1到N = 5; 如何指定存在至少一个T这样选择(T)?
Q2.我有一个二元谓词wrap(E,T),其中E,T的范围从1到M,N; 如何指定每个E至少存在一个T这样包裹(E,T)?
Q3.我怎么可以指定,如果selected(a)OR selected(b)那么selected(c)一定是假的
我实际上使用了两行代码,但可能有更好的方法:
:- selected(c), selected(a) .
:- selected(c), selected(b) .
Run Code Online (Sandbox Code Playgroud)
Q4.如何指定如果某个条件C(A)为真,则两个一元谓词p1(A)和p2(A)必须具有相同的值?
我实际上使用两行代码:
p1(A) :- C(A), p2(A)
:- C(A), not p2(A), p1(A)
Run Code Online (Sandbox Code Playgroud)
Q5.你建议哪一本书能够很好地介绍答案集编程?