argumentation_schemes/catalog/
popular.rs1use crate::catalog::POPULAR_ID_OFFSET;
6use crate::critical::CriticalQuestion;
7use crate::scheme::*;
8use crate::types::*;
9
10pub fn all() -> Vec<SchemeSpec> {
12 vec![
13 argument_from_popular_opinion(),
14 argument_from_tradition(),
15 argument_from_precedent(),
16 argument_from_established_rule(),
17 ]
18}
19
20pub fn argument_from_popular_opinion() -> SchemeSpec {
22 SchemeSpec {
23 id: SchemeId(POPULAR_ID_OFFSET),
24 name: "Argument from Popular Opinion".into(),
25 category: SchemeCategory::Popular,
26 premises: vec![
27 PremiseSlot::new("claim", "The claim widely accepted", SlotRole::Proposition),
28 PremiseSlot::new(
29 "population",
30 "The group that accepts the claim",
31 SlotRole::Agent,
32 ),
33 ],
34 conclusion: ConclusionTemplate::positive(
35 "?claim is plausible based on popular acceptance by ?population",
36 "?claim",
37 ),
38 critical_questions: vec![
39 CriticalQuestion::new(
40 1,
41 "What evidence supports that ?population actually accepts ?claim?",
42 Challenge::PremiseTruth("population".into()),
43 ),
44 CriticalQuestion::new(
45 2,
46 "Is ?population's acceptance based on good reasoning?",
47 Challenge::RuleValidity,
48 ),
49 CriticalQuestion::new(
50 3,
51 "Is ?claim the type of claim that popular acceptance makes more plausible?",
52 Challenge::RuleValidity,
53 ),
54 ],
55 metadata: SchemeMetadata {
56 citation: "Walton 2008 p.311".into(),
57 domain_tags: vec!["popular".into()],
58 presumptive: true,
59 strength: SchemeStrength::Weak,
60 },
61 }
62}
63
64pub fn argument_from_tradition() -> SchemeSpec {
66 SchemeSpec {
67 id: SchemeId(POPULAR_ID_OFFSET + 1),
68 name: "Argument from Tradition".into(),
69 category: SchemeCategory::Popular,
70 premises: vec![
71 PremiseSlot::new("practice", "The traditional practice", SlotRole::Action),
72 PremiseSlot::new(
73 "tradition",
74 "Evidence of longstanding tradition",
75 SlotRole::Property,
76 ),
77 ],
78 conclusion: ConclusionTemplate::positive(
79 "?practice should be continued based on ?tradition",
80 "continue_?practice",
81 ),
82 critical_questions: vec![
83 CriticalQuestion::new(
84 1,
85 "Has ?practice actually been a longstanding tradition?",
86 Challenge::PremiseTruth("tradition".into()),
87 ),
88 CriticalQuestion::new(
89 2,
90 "Were the circumstances that justified ?practice still applicable?",
91 Challenge::RuleValidity,
92 ),
93 CriticalQuestion::new(
94 3,
95 "Have conditions changed such that ?practice is no longer appropriate?",
96 Challenge::AlternativeCause,
97 ),
98 ],
99 metadata: SchemeMetadata {
100 citation: "Walton 2008 p.316".into(),
101 domain_tags: vec!["popular".into(), "tradition".into()],
102 presumptive: true,
103 strength: SchemeStrength::Moderate,
104 },
105 }
106}
107
108pub fn argument_from_precedent() -> SchemeSpec {
110 SchemeSpec {
111 id: SchemeId(POPULAR_ID_OFFSET + 2),
112 name: "Argument from Precedent".into(),
113 category: SchemeCategory::Popular,
114 premises: vec![
115 PremiseSlot::new("precedent_case", "The precedent case", SlotRole::Property),
116 PremiseSlot::new("current_case", "The current situation", SlotRole::Property),
117 PremiseSlot::new(
118 "action",
119 "The action taken in the precedent",
120 SlotRole::Action,
121 ),
122 ],
123 conclusion: ConclusionTemplate::positive(
124 "?action should be taken in ?current_case as it was in ?precedent_case",
125 "do_?action",
126 ),
127 critical_questions: vec![
128 CriticalQuestion::new(
129 1,
130 "Is ?current_case sufficiently similar to ?precedent_case?",
131 Challenge::DisanalogyClaim,
132 ),
133 CriticalQuestion::new(
134 2,
135 "Was ?action the right decision in ?precedent_case?",
136 Challenge::PremiseTruth("precedent_case".into()),
137 ),
138 CriticalQuestion::new(
139 3,
140 "Are there relevant differences between ?precedent_case and ?current_case?",
141 Challenge::DisanalogyClaim,
142 ),
143 ],
144 metadata: SchemeMetadata {
145 citation: "Walton 2008 p.319".into(),
146 domain_tags: vec!["popular".into(), "legal".into()],
147 presumptive: true,
148 strength: SchemeStrength::Moderate,
149 },
150 }
151}
152
153pub fn argument_from_established_rule() -> SchemeSpec {
155 SchemeSpec {
156 id: SchemeId(POPULAR_ID_OFFSET + 3),
157 name: "Argument from Established Rule".into(),
158 category: SchemeCategory::Popular,
159 premises: vec![
160 PremiseSlot::new("rule", "The established rule or law", SlotRole::Property),
161 PremiseSlot::new("case", "The case the rule applies to", SlotRole::Property),
162 ],
163 conclusion: ConclusionTemplate::positive(
164 "The outcome prescribed by ?rule applies to ?case",
165 "rule_applies_?case",
166 ),
167 critical_questions: vec![
168 CriticalQuestion::new(
169 1,
170 "Does ?rule actually apply to ?case?",
171 Challenge::PremiseTruth("case".into()),
172 ),
173 CriticalQuestion::new(
174 2,
175 "Is ?rule still valid and in force?",
176 Challenge::PremiseTruth("rule".into()),
177 ),
178 ],
179 metadata: SchemeMetadata {
180 citation: "Walton 2008 p.318".into(),
181 domain_tags: vec!["popular".into(), "legal".into(), "normative".into()],
182 presumptive: true,
183 strength: SchemeStrength::Strong,
184 },
185 }
186}
187
188#[cfg(test)]
189mod tests {
190 use super::*;
191
192 #[test]
193 fn all_returns_four_popular_schemes() {
194 assert_eq!(all().len(), 4);
195 }
196
197 #[test]
198 fn established_rule_has_strong_strength() {
199 assert_eq!(
200 argument_from_established_rule().metadata.strength,
201 SchemeStrength::Strong
202 );
203 }
204
205 #[test]
206 fn popular_ids_are_in_offset_range() {
207 for s in all() {
208 assert!(s.id.0 >= POPULAR_ID_OFFSET);
209 assert!(s.id.0 < POPULAR_ID_OFFSET + 100);
210 }
211 }
212}