- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下代码:
neighbor(C1, C2, [C1, C2|L]).
neighbor(C1, C2, [C2, C1|L]).
neighbor(C1, C2, [H|L]) :- neighbor(C1, C2, L).
not_neighbors(C5, C2, E, R) :-
not_neighbor(C5, C2, E).
not_neighbors(C5, C2, E, R) :-
not_neighbor(C5, C2, R).
/* THIS DON'T WORK */
not_neighbor(C5, C2, E) :-
\+ neighbor(C5, C2, E).
或者:
same_position(I, J, [I|U], [J|V]).
same_position(I, J, [M|U], [N|V]) :-
I \== M, % optimisation
J \== N, % optimisation
same_position(I, J, U, V).
/* THIS DON'T WORK */
not_under(C4, C1, R, E) :-
\+ same_position(C4, C1, R, E).
我知道问题在于否定,例如我想得到 same_position
相反的结果。
M。 @CapelliC 建议我使用 dif/2
但我不知道如何将其应用到我的具体示例中。
最佳答案
让我们首先从逻辑上思考列表中“邻居”的含义:在什么情况下 A
和 B
是列表中的相邻元素?
答案:如果列表的形式为 [...,X,Y,...]
并且至少满足以下其中一项:
A = X
和 B = Y
A = Y
和 B = X
。用逻辑术语来说:( A = X
∧ B = Y
) ∨ ( A = Y
∧ B = X
)。
我们想要陈述它的相反,即否定公式:
← ( ( A = X
∧ B = Y
) ∨ ( A = Y
∧ B = X
) ) ≡
� ( A = X
∧ B = Y
) ∧ � ( A = Y
∧ B = X
) � � �
≡(ØA = X
∨ØB = Y
)∧(ØA = Y
∨ØB = X
)Ø
≡ ( A
≠ X
∨ B
≠ Y
) ∧ ( A
≠ Y
∨ B
≠ X
)
谁会想到德摩根定律有任何实际应用,对吧?
为了在 Prolog 中声明 X
≠ Y
,我们使用强大的 dif/2
约束,正如 @CapelliC 已经建议的那样。 dif/2
为 true 当且仅当其参数是不同术语。它是一个纯谓词,并且在所有方向上都能正确工作。如果您的 Prolog 系统尚未提供它,请务必让您的供应商知道您需要它!在此之前,如有必要,您可以使用 iso_dif/2
来近似它。
在 Prolog 中,上面的内容就变成了:
( dif(A, X) ; dif(B, Y) ), ( dif(A, Y) ; dif(B, X) )
because (',')/2
denotes conjunction, and (;)/2
denotes disjunction.
So we have:
not_neighbours(_, _, []).not_neighbours(_, _, [_]).not_neighbours(A, B, [X,Y|Rest]) :- ( dif(A, X) ; dif(B, Y) ), ( dif(A, Y) ; dif(B, X) ), not_neighbours(A, B, [Y|Rest]).
A few test cases make us more confident about the predicate's correctness:
?- not_neighbours(a, b, [a,b]).false.?- not_neighbours(A, B, [A,B]).false.?- not_neighbours(A, B, [_,A,B|_]).false.?- not_neighbours(A, B, [_,B,A|_]).false.?- not_neighbours(a, b, [_,a,c,_]).true .
Note that this definition works correctly also if all arguments are variables, which we call the most general case.
A drawback of this solution is that (;)/2
creates many alternatives, and many of them do not matter at all. We can make this significantly more efficient by another algebraic equivalence that lets us get rid of unneeded alternatives:
¬ A ∨ B ≡ A → B
So, in our case, we can write (¬ A = X
∨ ¬ B = Y
) as A = X
→B
≠Y
.
We can express implication in Prolog with the powerful if_/3
meta-predicate:
impl(A, B) :- if_(A, B, true).
因此我们可以以声明方式等效地将我们的解决方案编写为:
not_neighbours(_, _, []).not_neighbours(_, _, [_]).not_neighbours(A, B, [X,Y|Rest]) :- impl(A=X, dif(B, Y)), impl(B=X, dif(A, Y)), not_neighbours(A, B, [Y|Rest]).
Sample query:
?- not_neighbours(a, b, [x,y]).true ;false.
And a more general case:
?- not_neighbours(a, b, [X,Y]).X = a,dif(Y, b) ;X = b,dif(Y, a) ;dif(X, b),dif(X, a) ;false.
You can use this predicate for checking and generating answers. Try for example iterative deepening to fairly enumerate all answers:
?- length(Ls, _), not_neighbours(A, B, Ls).
值得注意的是,纯粹的逻辑推理使我们得到了一个通用的且高效的 Prolog 程序。
dif/2
乍一看可能对您来说很不寻常,因为它出现在第一个 Prolog 系统中,然后一度被一些供应商忽略。如今,dif/2
在越来越多的实现中(再次)成为可用的,作为一个重要的内置谓词,它允许您以声明方式声明两个术语是不同的。使用 dif/2
可以避免其不纯的替代方案通常在 Prolog 类(class)中引起的巨大困惑。
关于序言 : get the opposite result,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39336904/
我有点困惑为什么在 RoutineRetrieved 函数中分配 ACTIVITYIMAGE 时使用 result.getInt(2) 并在分配 SLOT 时使用 result.getInt(3)..
我是android领域的新手,我想从响应json数组访问每个结果元素,但我无法做到这一点,我试图获取每个元素,但我只得到一个值“rohit1”是第一个元素。请帮助我。 我是 rohit parmar,
我只有从 sql 查询返回的一行 (count(*)),但在执行包时,它向我显示上述错误,并且包失败。 我将结果类型设置为“单行”,并将查询的输出(select count(*) as 'result
我正在尝试使用Diesel将简单的原始SQL转换为MySQL,如本示例所示: https://docs.diesel.rs/diesel/fn.sql_query.html let users = s
我正在尝试 Play 框架的第一个示例,但出现了此错误 在我的路线文件中: # API # ~~~~ GET /api/geotweets/index controllers.api.GeoTw
这段代码可以返回null吗? (this.Result == Result.OK) 此行(或类似行)是否可以返回除 true 或 false 之外的任何内容(例如 null)? 最佳答案 (this.
我有一个 SSIS 执行 SQL 任务。它返回一个完整的结果集(即一个表)。但是,当我执行包时出现以下错误。我已经正确地为返回的结果集命名。 [执行 SQL 任务] 错误:对于完整的结果集和 XML
最近我刚刚将 swift 2.3 项目转换为 3.2,alamofire 也得到了转换,我收到了很多问题,其中大部分都已解决,现在我被给定的两个问题所困扰 问题在 alamofire 的 Respon
我在 R 中收到以下错误消息: Error in .verify.JDBC.result(r, "Unable to retrieve JDBC result set", : Unable to r
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 去年关闭。
我正在使用一个简单的命令运行以下存储过程sp_MSforeachdb。我的问题是如何限制结果仅显示至少有 1 条记录满足命令的数据库: 这是我的存储过程: EXECUTE master.sys.sp_
我在单独的线程中运行一些代码: fn f1() -> Result { Err("err1".to_string()) } fn f2() -> Result { Err("err2"
我在这里尝试使用 AsyncTask 从 OWM API 显示 7 天的天气预报。 doInBackground(String...param) 方法也工作正常。我检查了 LOGCAT。 异步完成执行
我已经创建了mysql的索引和全文索引,后端存储引擎是MyISAM。 mysql> show index from play_movie; +------------+------------+---
我有一个表articles,它的结构如下: id, name, date, contents 我有一个表authors,它的结构如下: id, article_id, name, email 一篇文章
我很困惑我们是否应该创建单独的 API 来获取结果和结果计数,或者我们应该只根据结果 API 中的查询字符串来获取计数。 /api/results/ : Fetches all records /ap
我正在制作一个将两个数字相除的系统,如果第二个数字不存在,它将选择第一个数字。这是代码: let new_num: f32 = match num1/num2 { Ok(num) => n
这个问题在这里已经有了答案: Why am I getting "unused Result which must be used ... Result may be an Err variant,
我正在修改 the texture synth 中的示例之一项目: use texture_synthesis as ts; fn main() -> Result { //create a
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: ^ operator in java 我假设 c ^ d是一个类似“的幂”的计算,所以c = 5 , d = 2 ,
我是一名优秀的程序员,十分优秀!